実行
並列実行
NLCPyを使用するPythonスクリプトは、Vector Engine(VE)でマルチスレッド化することにより、性能を発揮します。並列スレッドのデフォルト数は、実行時に環境変数 VE_OMP_NUM_THREADS
で指定できます。 VE_OMP_NUM_THREADS
が未定義であるか、値が無効な場合、システムで使用可能なCPUコアの最大数が設定されます。
例を以下に示します。
対話モード:
$ VE_OMP_NUM_THREADS=4 python >>> import nlcpy
後続の計算は、VE上の4つの並列スレッドによって実行されます。
非対話モード:
$ VE_OMP_NUM_THREADS=4 python example.py
example.pyの計算は、VE上の4つの並列スレッドによって実行されます。
VEのノード番号を指定する場合は、次のように環境変数 VE_NODE_NUMBER
を使用する必要があります。
対話モード:
$ VE_NODE_NUMBER=1 VE_OMP_NUM_THREADS=4 python >>> import nlcpy
後続の計算は、VEノード#1の4つの並列スレッドによって実行されます。
非対話モード:
$ VE_NODE_NUMBER=1 VE_OMP_NUM_THREADS=4 python example.py
example.pyの計算は、VEノード#1の4つの並列スレッドによって実行されます。
注釈
1つのVEに対して2つ以上のNLCPyプログラムを実行すると、コンテキストスイッチが発生します。 このような場合、パフォーマンスは大幅に低下します。
数学関数の最適化
環境変数 VE_NLCPY_FAST_MATH
を yes
または YES
に設定すると、NLCPyはVE用に最適化した共有オブジェクト libnlcpy_ve_kernel_fast_math.so
を使用します。デフォルトでは、VE_NLCPY_FAST_MATH
は未設定です。共有オブジェクト libnlcpy_ve_kernel_fast_math.so
は、NEC C/C++コンパイラの以下の最適化オプションを指定してコンパイルされています。
-ffast-math
ベクトル化ループ外でスカラ高速バージョンの数学関数を使用します。
-mno-vector-intrinsic-check
ベクトル化された部分から呼び出された数学関数の引数の値の範囲を実行時に検査しません。このオプションの対象となる数学関数は次のとおりです。acos
,acosh
,asin
,atan
,atan2
,atanh
,cos
,cosh
,cotan
,exp
,exp10
,exp2
,expm1
,log10
,log2
,log
,pow
,sin
,sinh
,sqrt
,tan
,tanh
-freciprocal-math
式
x/y
をx * (1/y)
に変更します。-mvector-power-to-explog
ベクトル化されたループ中の
pow(R1,R2)
の呼び出しをexp(R2*log(R1))
の呼び出しに置き換えることを許可します。powf()
に対しても同様の最適化が適用されます。pow
、powf
で計算した場合に比べて実行時間は短縮されますが、計算結果が誤差レベルで変わることがあります。-mvector-low-precise-divide-function
低精度のベクトル浮動小数点数除算を使用します。通常精度版と比較して高速に処理されますが、除算結果の仮数部に最大1ビットの誤差が含まれることがあります。
これらの最適化は副作用を引き起こします。 たとえば、 nan
または inf
が正しく取得されない場合があります。
VE_NLCPY_FAST_MATH
は次のように設定できます。
対話モード:
$ VE_NLCPY_FAST_MATH=yes python >>> import nlcpy
非対話モード:
$ VE_NLCPY_FAST_MATH=yes python example.py
スレッドのウォーミングアップとメモリの事前確保
環境変数 VE_NLCPY_WARMUP
を yes
または YES
に設定すると、NLCPyは初期化時に約10GiBのメモリを事前確保し、いくつかのVEカーネルを実行します。デフォルトでは、VE_NLCPY_WARMUP
は未設定です。
このオプションを有効に設定することで性能改善するケースがあります。ただし、メモリフラグメンテーションの影響でメモリ不足が発生することがあります。