質問編集履歴
3
実施したのを記載
title
CHANGED
File without changes
|
body
CHANGED
@@ -21,8 +21,6 @@
|
|
21
21
|
```
|
22
22
|
### 試したこと
|
23
23
|
- [Parallel Tool boxのマニュアル](https://jp.mathworks.com/help/parallel-computing/getting-started-with-parallel-computing-toolbox.html)及び[公式質問](https://jp.mathworks.com/matlabcentral/answers/index)の閲覧。基本的に**マルチコアCPUのみ**や**複数GPUのみ**での並列計算に関する解決法のみで、本問題である**「マルチコアCPUとGPUの併用で行う並列計算」**に関する解決は現状見つかってない。
|
24
|
-
|
25
|
-
### 現在試していないが、近日中に試すこと
|
26
24
|
- [リンク先の質問](https://jp.mathworks.com/matlabcentral/answers/311336-gpu?s_tid=srchtitle)にて、gpuDevice関数を用いて、GPUを選択させて並列計算を行うコードを見つけた。そこで以下のコードを作製して、《CPU上での並列計算》と《GPU上での並列計算》を別々で行う。
|
27
25
|
```MATLAB
|
28
26
|
n = 100000;
|
@@ -30,21 +28,40 @@
|
|
30
28
|
v = zeros(1,n);
|
31
29
|
parpool('local');
|
32
30
|
|
31
|
+
tic;
|
33
32
|
parfor i=1:n
|
34
|
-
|
33
|
+
if mod(i,16)==0
|
34
|
+
gpuDevice(1);
|
35
|
+
A = rand(1,m,'gpuArray');
|
36
|
+
B = rand(m,1,'gpuArray');
|
37
|
+
v(i) = A*B;
|
38
|
+
elseif mod(i,16)==1
|
39
|
+
gpuDevice(2);
|
40
|
+
A = rand(1,m,'gpuArray');
|
41
|
+
B = rand(m,1,'gpuArray');
|
42
|
+
v(i) = A*B;
|
43
|
+
elseif mod(i,16)==2
|
44
|
+
gpuDevice(3);
|
45
|
+
A = rand(1,m,'gpuArray');
|
46
|
+
B = rand(m,1,'gpuArray');
|
47
|
+
v(i) = A*B;
|
48
|
+
elseif mod(i,16)==3
|
49
|
+
gpuDevice(4);
|
50
|
+
A = rand(1,m,'gpuArray');
|
51
|
+
B = rand(m,1,'gpuArray');
|
52
|
+
v(i) = A*B;
|
53
|
+
else
|
35
|
-
|
54
|
+
A = rand(1,m);
|
36
|
-
|
55
|
+
B = rand(m,1);
|
37
|
-
|
56
|
+
v(i) = A*B;
|
38
|
-
|
57
|
+
end
|
39
|
-
k = mod(i,5);
|
40
|
-
gpuDevice(k);
|
41
|
-
A = rand(1,m,'gpuArray');
|
42
|
-
B = rand(m,1,'gpuArray');
|
43
|
-
v(i) = A*B;
|
44
58
|
end
|
59
|
+
toc
|
45
60
|
|
46
61
|
delete(gcp('nocreate'));
|
47
62
|
```
|
63
|
+
**マルチコアCPUのみの実施→0.39sec、マルチコアCPU+4台GPUでの計算→50sec**
|
64
|
+
GPUの使用量を確認したところ増えたのを確認したが、時間がかかった。
|
48
65
|
|
49
66
|
### 補足情報
|
50
67
|
PC環境:12コアマルチCPU + 4つのGPUを搭載したワークステーション。故に並列プールは16になるはずである。
|
2
試したことの記載
title
CHANGED
File without changes
|
body
CHANGED
@@ -19,6 +19,32 @@
|
|
19
19
|
|
20
20
|
delete(gcp('nocreate'));
|
21
21
|
```
|
22
|
+
### 試したこと
|
23
|
+
- [Parallel Tool boxのマニュアル](https://jp.mathworks.com/help/parallel-computing/getting-started-with-parallel-computing-toolbox.html)及び[公式質問](https://jp.mathworks.com/matlabcentral/answers/index)の閲覧。基本的に**マルチコアCPUのみ**や**複数GPUのみ**での並列計算に関する解決法のみで、本問題である**「マルチコアCPUとGPUの併用で行う並列計算」**に関する解決は現状見つかってない。
|
24
|
+
|
25
|
+
### 現在試していないが、近日中に試すこと
|
26
|
+
- [リンク先の質問](https://jp.mathworks.com/matlabcentral/answers/311336-gpu?s_tid=srchtitle)にて、gpuDevice関数を用いて、GPUを選択させて並列計算を行うコードを見つけた。そこで以下のコードを作製して、《CPU上での並列計算》と《GPU上での並列計算》を別々で行う。
|
27
|
+
```MATLAB
|
28
|
+
n = 100000;
|
29
|
+
m = 500;
|
30
|
+
v = zeros(1,n);
|
31
|
+
parpool('local');
|
32
|
+
|
33
|
+
parfor i=1:n
|
34
|
+
if mod(5,i)==0
|
35
|
+
A = rand(1,m);
|
36
|
+
B = rand(m,1);
|
37
|
+
v(i) = A*B;
|
38
|
+
else
|
39
|
+
k = mod(i,5);
|
40
|
+
gpuDevice(k);
|
41
|
+
A = rand(1,m,'gpuArray');
|
42
|
+
B = rand(m,1,'gpuArray');
|
43
|
+
v(i) = A*B;
|
44
|
+
end
|
45
|
+
|
46
|
+
delete(gcp('nocreate'));
|
47
|
+
```
|
48
|
+
|
22
49
|
### 補足情報
|
23
|
-
|
24
|
-
PC環境
|
50
|
+
PC環境:12コアマルチCPU + 4つのGPUを搭載したワークステーション。故に並列プールは16になるはずである。
|
1
MATLABの問題であることを記載
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
マルチコアCPUとGPUを併用した並列計算
|
1
|
+
MATLABを用いた、マルチコアCPUとGPUを併用した並列計算
|
body
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
|
-
以下のプログラムをマルチコアCPUとGPUを併用して並列計算をしたいのですが、parpoolで並列プールを呼び出しても、マルチコアCPU物理コア数のみしか呼び出せません。
|
2
|
+
**MATLABという言語を用いて**以下のプログラムをマルチコアCPUとGPUを併用して並列計算をしたいのですが、parpoolで並列プールを呼び出しても、マルチコアCPU物理コア数のみしか呼び出せません。
|
3
3
|
どのように設定すればGPUを併用した並列計算をできるのでしょうか?
|
4
4
|
|
5
5
|
### 該当のソースコード
|