シトン
CythonはOpenMPをサポートしています。Cython では、prange
(並列範囲) 演算子を使用し、 -fopenmp
setup.py にコンパイラ ディレクティブを追加することで、OpenMP を追加できます。
prange スタンザで作業する場合、 を使用してグローバル インタープリター ロック (GIL)with nogil:
を無効にするブロックを指定することにより、実行が並列で実行されます。
cython_np.pyxをコンパイルするには、以下に示すように setup.py スクリプトを変更する必要があります。-fopenmp
OpenMP を有効にして OpenMP ライブラリとリンクするために、コンパイル中に引数として使用するように C コンパイラに通知するように指示します。
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
cmdclass = {"build_ext": build_ext},
ext_modules = [
Extension(
"calculate",
["cython_np.pyx"],
extra_compile_args = ["-fopenmp"],
extra_link_args = ["-fopenmp"]
)
]
)
Cython ではprange,
、さまざまなスケジューリング手法を選択できます。静的では、ワークロードは使用可能な CPU 間で均等に分散されます。ただし、一部の計算領域は時間的に高価であり、他の領域は安価であるため、Cython にCPU 全体でスタティックを使用して作業チャンクを均等にスケジュールするように依頼すると、一部の領域の結果は他の領域よりも速く完了し、それらのスレッドはその後じっと座っている。ダイナミックとガイドの両方スケジュール オプションは、ワークロードの計算時間が変動する場合に CPU がより均等に分散されるように、実行時に動的に小さなチャンクで作業を割り当てることにより、この問題を軽減しようとします。したがって、コードの正しい選択は、ワークロードの性質によって異なります。
ナンバー
Numba のプレミアム バージョンである NumbaPro は、prange
OpenMP を操作するための並列化演算子を実験的にサポートしています。
ピトラン
Pythran (Python のサブセット用の Python-to-C++ コンパイラ) は、Python 2.7 のみを使用して実行されますが、ベクトル化の可能性と OpenMP ベースの並列化の可能性を利用できます。ディレクティブを使用して並列セクションを指定しますpragma omp
(上記の Cython の OpenMP サポートと非常によく似ています)。
PyPy
JIT Python コンパイラ PyPy は、マルチプロセッシング モジュール (以下を参照) をサポートし、PyPy-STM と呼ばれるプロジェクトを持っています。「PyPyの特別な開発中バージョンであり、同じプロセスで複数の独立した CPU を大量に消費するスレッドを並行して実行できます」。
補足: マルチプロセッシング
OpenMP は、複数のコアへの低レベル インターフェイスです。multiprocessing.
モジュールはより高いレベルで動作し、Python データ構造を共有しますmultiprocessing
が、OpenMP は C にコンパイルすると、C プリミティブ オブジェクト (整数や浮動小数点数など) で動作します。OpenMP を使用するのは、 'コードをコンパイルしています。コンパイルしていない場合 (たとえば、効率的なnumpyコードを使用していて、多くのコアで実行したい場合)、そのままにしておくmultiprocessing
のがおそらく正しいアプローチです。