各種並列処理ライブラリの実験

OpenMP、並列パターンライブラリ(PPL: Microsoft Parallel Patterns Library)、C++AMP(C++ Accelerated Massive Parallelism)をちょびっと試しました。

Microsoft Visual C++シリーズでの開発を前提とします。

0. その前に

C++11のラムダ式の知識が必須(このへんとかを参照)

1. 動作条件

OpenMP : Visual Studio 2005以降(Express版ではWindows SDKが要るかもしれない)

PPL : Visual Studio 2010以降

C++ AMP : Visual Studio 2012

2. 各ライブラリの違い

OpenMP : クロスプラットフォームで対応するコンパイラが多い。pragmaディレクティブで簡単に並列化。

PPL : Microsoft独自。「同時実行ランタイム」の中で提供。ラムダ式と相性が良い。結構多機能。

C++ AMP : Microsoftと(たぶん)AMDが開発、規格はオープン。GPGPU(Direct3D 11のCompute Shaderに変換される)。PPLと統合したっぽい。

3. サンプル

奇偶転置ソートを試しました。符号付き32bit整数を昇順に並べ替えます。ソートのアルゴリズムとしては悪い(最悪計算量がO(N^2))ですが、アルゴリズムがシンプルなので使いました。本気で並列処理でソートするならばbitonic sortやradix sortが良いでしょう。

長いのでソースコードはpasetbinに置いておきます

oddEvenSort()が基本形です。oddEvenSort2()はループ変数が0から順になるように変形しています。

oddEvenSortOpenMP()がOpeMP版です。for文に#pragma omp parallel forをつけるだけです。コンパイラの設定でOpenMPを有効にしないと、無視されてシングルスレッドになるので注意してください。

oddEvenSortAmp()がC++ AMP版です。GPUのスレッドは0番から順にIDが振られるので、oddEvenSort2()がベースです。concurrency名前空間のarray_viewクラスが、CPUとGPUのメモリ空間の接続する窓の役割をします(Direct3D 11のUnordered Access Viewに相当)。extentがスレッド数です(OpenCLのget_global_id()に相当)。parallel_for_each()で処理を開始します。restrict( amp )をつけると、そのコードがGPU上で動作させることを知らせます。

oddEvenSortPPL()がPPL版です。.NET Framework 4.0のParallel Extensionsにソックリです。

4. 実行時間

N = 50000のときの時間を計測しました。単位は秒(小さいほど良い)。Visual Studio 2012 Professional。

Celeron(Penryn-L, 2core) + GMA4500MHD

Sort1 6.396
Sort2 6.302
OpenMP 4.649
PPL 39.811
Amp (ソフトウェアエミュレーション)10分以上

i7(SandyBridge, 2core/4thread) + Radeon HD 6630M

Sort1 2.106
Sort2 1.965
OpenMP 2.200
PPL 14.274
Amp 15.600

5. 適当に考察と補足

奇偶転置ソートでは処理が単純すぎて、並列化のコストの方が大きくなっているようです。

C++ AMPの実行時、GPU負荷は約60%でした。CPUの呼び出しコストの方がボトルネックになっていると思います。

6. 他の並列ライブラリ

Visual Studio単体でできる並列処理ライブラリ以外にも、次のようなものがあります。

Intel TBB(Threading Building Blocks) : Intel製のオープンソース。AMD x86プロセッサでも動く。

Apple GCD(Grand Central Dispatch) : Apple製。OS X Snow Leopardの目玉機能の一つ。

C=(CSTRIPES) : よくわからん。気付いたらOpenCVが対応していた。Windows/Linuxのx86/x64向け。

NVIDIA CUDA : NVIDIA製。GPGPU。Tesla/Quadro/GeForce専用。

Khronos OpenCL : Apple提唱、クロスプラットフォーム。GPGPUも可能。

OpenACC : たぶんNVIDIA提唱。OpenMPのGPU版。

広告

各種並列処理ライブラリの実験」への1件のフィードバック

  1. ピンバック: バイトニックソートの並列処理 « shobomalog

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中