使用gpuArrays加速Matlab中的模拟

时间:2018-01-17 14:25:31

标签: matlab for-loop parallel-processing

我有一个更新数组的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;随机模拟(大数组和矩阵上的多个线性运算)。

2 个答案:

答案 0 :(得分:1)

没有

这就是GPU计算的工作原理。不幸的是,这不是魔术。 CPU-GPU通信速度慢,非常慢。每次迭代,您在CPU上创建一个数组并将其发送到GPU,这是缓慢的部分。我确信在GPU中“CPU”+操作的速度非常快,但是这种改进完全被将信息发送到GPU所花费的时间所掩盖。

您的代码按原样几乎没有改进的余地。

答案 1 :(得分:0)

它可能不会帮助整体速度(正如@Ander在他的回答中提到的那样),但你可以做的一个小改进是直接在GPU上构建随机数,如下所示:

rand(1, 10000, 'gpuArray')

通常,GPU上的随机数生成要比CPU快得多。

您可以使用gpuArrayarrayfun进一步,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