前提・実現したいこと
MATLABという言語を用いて以下のプログラムをマルチコアCPUとGPUを併用して並列計算をしたいのですが、parpoolで並列プールを呼び出しても、マルチコアCPU物理コア数のみしか呼び出せません。
どのように設定すればGPUを併用した並列計算をできるのでしょうか?
該当のソースコード
**目的:**成分数が500の横ベクトルAと縦ベクトルBを乱数によって発生させ、その積を求める。求めた値を成分10万個のベクトルvに収納させる。
MATLAB
1n = 100000; 2m = 500; 3v = zeros(1,n); 4parpool('local'); 5 6parfor i=1:n 7A = rand(1,m); 8B = rand(m,1); 9v(i) = A*B; 10end 11 12delete(gcp('nocreate'));
試したこと
- Parallel Tool boxのマニュアル及び公式質問の閲覧。基本的にマルチコアCPUのみや複数GPUのみでの並列計算に関する解決法のみで、本問題である**「マルチコアCPUとGPUの併用で行う並列計算」**に関する解決は現状見つかってない。
- リンク先の質問にて、gpuDevice関数を用いて、GPUを選択させて並列計算を行うコードを見つけた。そこで以下のコードを作製して、《CPU上での並列計算》と《GPU上での並列計算》を別々で行う。
MATLAB
1n = 100000; 2m = 500; 3v = zeros(1,n); 4parpool('local'); 5 6tic; 7parfor i=1:n 8 if mod(i,16)==0 9 gpuDevice(1); 10 A = rand(1,m,'gpuArray'); 11 B = rand(m,1,'gpuArray'); 12 v(i) = A*B; 13 elseif mod(i,16)==1 14 gpuDevice(2); 15 A = rand(1,m,'gpuArray'); 16 B = rand(m,1,'gpuArray'); 17 v(i) = A*B; 18 elseif mod(i,16)==2 19 gpuDevice(3); 20 A = rand(1,m,'gpuArray'); 21 B = rand(m,1,'gpuArray'); 22 v(i) = A*B; 23 elseif mod(i,16)==3 24 gpuDevice(4); 25 A = rand(1,m,'gpuArray'); 26 B = rand(m,1,'gpuArray'); 27 v(i) = A*B; 28 else 29 A = rand(1,m); 30 B = rand(m,1); 31 v(i) = A*B; 32 end 33end 34toc 35 36delete(gcp('nocreate'));
マルチコアCPUのみの実施→0.39sec、マルチコアCPU+4台GPUでの計算→50sec
GPUの使用量を確認したところ増えたのを確認したが、時間がかかった。
補足情報
PC環境:12コアマルチCPU + 4つのGPUを搭載したワークステーション。故に並列プールは16になるはずである。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。