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

42 views (last 30 days)
Srinidhi Ganeshan on 14 Jan 2019
Commented: Rachel Chen on 2 Apr 2020
% 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 ?

Matt J on 14 Jan 2019
Edited: Matt J on 15 Jan 2019
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...

Srinidhi Ganeshan on 23 Jan 2019
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 on 23 Jan 2019
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 on 2 Apr 2020
@Matt, can I use parfor with CPU and GPU like this as well?

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by