我有一个更新数组的Matlab模拟:
Array=zeros(1,1000)
如下:
for j=1:100000
Array=Array+rand(1,1000)
end
我的问题如下: 此循环是线性的,因此不能对阵列中的每个插槽进行parralelized,但不同的插槽会独立更新。因此,Matlab自然会使用CPU的所有内核在parralell中执行此类数组操作。
我希望在我的NVIDIA GPU上进行相同的计算,以便加速(利用那里的大量核心)。
问题是: 天真地做着
tic
Array=gpuArray(zeros(1,1000));
for j=1:100000
Array=Array+gpuArray(rand(1,1000));
end
toc
导致计算时间<8> 更长!
一个。我做错了什么?
更新: 湾有人可以提供一个不同的简单示例,GPU计算对哪些有益?我的目的是了解如何在Matlab中使用它来实现非常重的&#34;随机模拟(大数组和矩阵上的多个线性运算)。
答案 0 :(得分:1)
没有
这就是GPU计算的工作原理。不幸的是,这不是魔术。 CPU-GPU通信速度慢,非常慢。每次迭代,您在CPU上创建一个数组并将其发送到GPU,这是缓慢的部分。我确信在GPU中“CPU”+操作的速度非常快,但是这种改进完全被将信息发送到GPU所花费的时间所掩盖。
您的代码按原样几乎没有改进的余地。
答案 1 :(得分:0)
它可能不会帮助整体速度(正如@Ander在他的回答中提到的那样),但你可以做的一个小改进是直接在GPU上构建随机数,如下所示:
rand(1, 10000, 'gpuArray')
通常,GPU上的随机数生成要比CPU快得多。
您可以使用gpuArray
版arrayfun
进一步,JIT将正文编译为本机GPU代码。在我的GPU(Tesla K20c)上,这使GPU版本比CPU版本快10倍。这是完整的脚本:
%% CPU version
tic
Array=zeros(1,1000);
for j=1:100000
Array=Array+rand(1,1000);
end
cpuTime = toc
%% GPU version
dev = gpuDevice();
tic
Array = zeros(1, 1000, 'gpuArray');
Array = arrayfun(@iFcn, Array);
wait(dev);
gpuTime = toc
%% Arrayfun body
function x = iFcn(x)
for j = 1:100000
x = x + rand;
end
end