hack のためのネタ帳, etc,,,

公式ページ等

参考になるページ等

parfor の効果について

以下に解説があるが MATLAB 単体の行列演算については R2007a で multithread 対応済み。 つまり Parallel Computing Toolbox を導入していない環境でも行列演算に限定すれば実はマルチコアの恩恵は既に十分に得られている。
2013-07-23 現在の最新バージョンである R2013a では maxNumCompThreads で設定した値に関わらず、計算スレッドの最大数は、使用しているマシン上の計算コア数が上限となる。
このため Hyper Threading 対応の環境では CPU 負荷は 50% までしか使い切れないが、仮に Hyper Threading が利用出来た場合でもパフォーマンス上昇は通常 3 割程度がせいぜいある。

parfor を用いる場合 NumWorkers はデフォルトで物理コア数が採用される。このため Hyper Threading 環境で標準設定のまま使うと CPU 負荷は 50% までしか使い切れない。
Hyper Threading 環境で CPU 負荷を 100% まで使い切るには Cluster Profiles を編集して NumWorkers に Hyper Threading による仮想コア数を設定すれば良い。

ただし parfor による並列化は比較的オーバーヘッドが大きくなる点には注意が必要。
parfor 内の演算が行列演算主体である場合、既に物理コアによるリソースはほぼ使い切っているため Hyper Threading によるメリットよりもオーバーヘッドによるペナルティのほうが顕著となるため、パフォーマンスはかえって悪化する可能性が高い。Hyper Threading の無い環境に至っては、オーバーヘッドによるペナルティしか生じない。

結論として parfor でパフォーマンスが向上可能なケースというのは parfor 内の処理が行列演算主体でない場合、もしくはクラスターを組んでいる場合に限定される。
クラスターを使うには MATLAB Distributed Computing Server も必要らしい。

GPU Computing について

parfor が上記のような状況なので Parallel Computing Toolbox の本命は実はこっちなんじゃないかって気がしてる。

以下の記事によると R2010b の Parallel Computing Toolbox から GPU Computing が利用可能になった模様。 使い方は「3行書くだけ」と言うだけあって非常に簡単。
上記の記事のサンプルを引用すると以下の3ステップで完結する。
GX = gupArray(X); % GPUメモリに送信
GY = fft2(GX);    % fft2をGPU 上で実行
Y = gather(GY);   % 結果をメインメモリへ回収

GPU Computing に必要な GPU の要件については以下に記述がある。 2013-07-23 現在の最新バージョン R2013a では CUDA 対応の GPU で Compute Capability 1.3 以上が必要であり、将来のリリースでは 2.0 以上が必要になるとのこと。
残念ながら現時点では OpenCL には非対応らしい。

CUDA 対応 GPU の Compute Capability については以下に情報がある。
Tesla が利用できる場合はあまり問題にならないが GeForce しか利用出来ない場合、倍精度浮動小数点演算に著しい機能制限が施されているので注意。
単精度で問題ない場合は gpuArray の classUnderlying を single に統一しておくと良い。

2013-08-17: sparse matrix について

少なくとも R2013a においては sparse matrix が double 限定みたいな状況で single が使えない。
と言うことで、sparse matrix 使ってる場合 gpuArray に持って行っても double じゃないと計算出来ないということになるので、Kepler 世代の倍精度ペナルティーをもろにかぶってしまう模様。
うわ、使えねー。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます