Python、scipy.weave、openMP-オーバークロックコード

Hello%username%。この記事は、 scipy.weaveopenMPを使用して、 Python言語に基づいた数学計算の速度を上げる問題に取り組んでいます。



多くの人は「なぜ数学計算にpythonを使用するのでしょうか?」



ツール



上記のように、ツールはscipy.weaveライブラリとopenMPライブラリです。

scipy-応用数学と科学のコンピューティングのためのライブラリのセット。 openMPは、C、C ++、およびFortranプログラムを並列化するためのオープンスタンダードです。



パッケージのインストール



DebianのようなLinuxシステムでは、次のことを行う必要があります。

  apt-get python-scipyのインストール
 apt-get libgomp1のインストール 


方法



計算の速度を上げるには、Pythonコードの「狭い」部分(通常、マトリックスで何らかのアクションが発生するサイクル)をCで実装し 、並列化のためのopenMPディレクティブを追加する必要があります。





例として次の問題を解決することにより、この方法を検証することよりも良い方法はないと思います。

Pythonの実装



python cでは、 numpyを使用して、マトリックス生成などのさまざまな準備操作を考慮せずに、このタスクを数行のコードで解決します。

  1. #行列の行をループします。iは行番号です
  2. #cは整数、randRowはランダムなベクトル
  3. xrange N )の iの場合
  4. 行列[ i ,: ] - = c * randRow
yによるランダム行列xの生成、この場合x = y:

  1. #ランダム行列xをyで生成
  2. #行列要素-0から99までの乱数。
  3. def randMat x、y
  4. randRaw = lambda a [ randint 0、100 for i in xrange 0 、a ]
  5. randConst = lambda x、y [ xrange 0 、y )の eのrandRaw x ]
  6. 配列を返す randConst x、y

openMPを使用しないScipy.weaveの実装



scipy.weaveは、 pythonコード内でC / C ++コードを使用できるscipyライブラリの一部です。

次のように発生します。

  1. #Cコード
  2. codeC =
  3. 「」
  4. int i = 0;
  5. for(i = 0; i <N * M; i ++){
  6. マトリックス[0、i] =マトリックス[0、i]-(c * randRow [i%M]);
  7. }
  8. 織ります。 インライン codeC、 [ 'matrix''c''randRow''N''M' ] 、compiler = 'gcc'


つまり Cコード自体は複数行の文字列として保存され、 Pythonコード変数はCリストに渡されます。ここで、要素は同じテキスト定数です。 また、 numpy配列は、行列の形式ではなくベクトルの形式でCに転送されます。これが、コードに2つではなく1つのサイクルがある理由です。



ちなみに、結果のCコードは/ tmp /%user%/ python2x_intermediate / compiler_xで検索できます



openMPを使用したScipy.weaveの実装



ここで、追加されたバージョンに、 openMPディレクティブを追加し、 インライン呼び出しで欠落しているパラメーターを追加する必要があります。

  1. #CおよびopenMPコード
  2. codeOpenMP =
  3. 「」
  4. int i = 0;
  5. omp_set_num_threads(2);
  6. #pragma omp parallel shared(matrix、randRow、c)private(i)
  7. {
  8. #pragma omp for
  9. for(i = 0; i <N * M; i ++){
  10. マトリックス[0、i] =マトリックス[0、i]-(c * randRow [i%M]);
  11. }
  12. }
  13. ...
  14. 織ります。 インライン codeOpenMP、 [ 'matrix''c''randRow''N''M' ]
  15. extra_compile_args = [ '-O3 -fopenmp' ]
  16. コンパイラ= 'gcc'
  17. ライブラリ= [ 'gomp' ]
  18. ヘッダー= [ '<omp.h>' ]
すべての実装を含む完全なソースコードは、 ここからダウンロードできます。



結果の比較



上記のソースコードを実行して、 scipy.weaveが実際に速度を向上させることを確認できます。

サイズのテスト:100x100
	ピュアパイソン:0.0725984573364
	ピュアC:0.303888320923
	 CプラスOpenMP:0.109100341797
	テスト-OK

サイズのテスト:1000x1000
	ピュアPython:1.00839138031
	ピュアC:0.506997108459
	 CプラスOpenMP:0.333213806152
	テスト-OK

サイズのテスト:2000x2000
	ピュアパイソン:3.24151515961
	ピュアC:2.10800170898
	 CプラスOpenMP:1.17690563202
	テスト-OK

サイズのテスト:3000x3000
	ピュアPython:5.54490089417
	ピュアC:4.61800098419
	 CプラスOpenMP:2.56960391998
	テスト-OK


文学



コードの記述には、次のリソースが使用されました。




All Articles