我正在使用Matlab,我想利用我的2个GPU我有一个不适合1个GPU的大矩阵,但是一半的矩阵适合1个GPU。因此,我想将矩阵切成两半,然后让我的2个GPU中的每一个都在矩阵的一半上工作。我的工作如下
try
parpool('local',gpuDeviceCount)
end
spmd
gpuDevice
end
dp = 0.00001;
R = zeros(1,2);
parfor k=1:1:2
if k==1
M = gpuArray([dp:2*dp:10])
else
M = gpuArray([2*dp:2*dp:10])
end
R(k) = arrayfun(@(x) myfun,M);
end
[我的问题是:我怎么知道我确实在每个GPU上创建了2个M
向量(它们是不同的)?是否有一个内置函数可以显示此内容?为什么我们需要spmd gpuDevice end
?目前,我可以感觉到,就速度而言,parfor
似乎比常规for
快2倍。但是如何确定每个GPU确实存储了不同的M
? 我不知道它是否实际复制了两次gpuArray([dp:2*dp:10])
和两次gpuArray([2*dp:2*dp:10])
?
并且在这段代码完成之后,我发现我的向量M
没有出现在工作区中。但是parfor
代码之外定义的其他变量仍在工作空间中。如果我只使用for
而不是parfor
(但使用M
较小的尺寸以便可以容纳1个GPU),则在for loop
之后,向量M
在工作区中,其类型为gpuArray
。为什么使用parfor
,然后在parfor loop
之后,在parfor loop
中定义的那些变量都消失了?
回答您的一些问题。