# How to use GPU and CPU simultaneously in a for loop ?

41 ビュー (過去 30 日間)
Srinidhi Ganeshan 2019 年 1 月 14 日
コメント済み: Rachel Chen 2020 年 4 月 2 日 2:07
% n be the number of iterations : 6
% A be the two dimensional matrix of size 10*10 stored in three dimension.
for i=1:n
A(:,:,i)=rand(10,10);
[Q(:,:,i),R(:,:,i)]=qr(A(:,:,i));
end
1)Here, n is the number of iterations and each iterations can run independently, I wanted to use both CPU and GPU i.e if (i==1) is running on CPU, (i==2) should run on GPU. If for example, GPU completes before CPU, then it should automatically carry on with the next iteration which is (i==3). Once the CPU completes, (i==1), it should proceed with (i==4) and so on. Both GPU and CPU should run asynchronously, where GPU itself should run in an asynchronous manner. How should I implement this ?
2) If i have 2 gpu's then same as the above method, if (i==1) is running on CPU, (i==2) should run on GPU1 and (i==3)should un on GPU2. Which ever completes work faster should take next iteration and so on. How to implement this ?

#### 0 件のコメント

サインイン to comment.

### 採用された回答

Matt J 2019 年 1 月 14 日

You can't make the CPU and GPU do alternating loop iterations, but you can divide the slices of A into two batches, and make the CPU and GPU work asynchronously on their respective batch, as below.
Acpu=A(:,:,1:n/2); %chunk #1 : send to CPU
Agpu=gpuArray(A(:,:,n/2+1:end)); %chunk #2 : send to GPU with device index 1
p=parpool(2);
F(1)=parFeval(p, @deploy,2,Acpu);
F(2)=parFeval(p, @deploy,2,Agpu,1);
[Q,R] = fetchOutputs(F,'UniformOutput',false); % Blocks until complete
Q=cat(3,Q{1},gather(Q{2}));
R=cat(3,R{1},gather(R{2}));
function [q,r]=deploy(a,Id)
if nargin>1, gpuDevice(Id);end
for i=size(a,3):-1:1
[q(:,:,i),r(:,:,i)]=qr(A(:,:,i));
end
end
Naturally, you should pass the gpuDevice ID numbers that are actually assigned to the graphics cards on your machine. Above, I've assumed they are numbered 1,2, etc...

#### 6 件のコメント

Srinidhi Ganeshan 2019 年 1 月 23 日
F(2)=parfeval(p, @deploy,2,Agpu1,1);
F(3)=parfeval(p, @deploy,2,Agpu2,2);
Apparently, giving id as 1,2 isn't working. Is there any other way, one could define Gpu device Index in parfeval such that it can work ?
Matt J 2019 年 1 月 23 日
You should pass the gpuDevice ID numbers that are actually assigned to the graphics cards that you are trying to use.
for i=1:gpuDeviceCount
gpuDevice(i),
end
Rachel Chen 2020 年 4 月 2 日 2:07
@Matt, can I use parfor with CPU and GPU like this as well?

サインイン to comment.

### その他の回答 (0 件)

サインイン してこの質問に回答します。

Translated by