How to use GPU and CPU simultaneously in a for loop ?
2 次查看(过去 30 天)
显示 更早的评论
% 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 个评论
采纳的回答
Matt J
2019-1-14
编辑:Matt J
2019-1-15
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...
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 GPU Computing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!