【问题标题】:Speeding up simulation in Matlab using gpuArrays使用 gpuArrays 在 Matlab 中加速仿真
【发布时间】:2018-06-26 11:15:38
【问题描述】:

我有一个更新数组的 Matlab 模拟:

Array=zeros(1,1000) 

如下:

for j=1:100000 
Array=Array+rand(1,1000) 
end 

我的问题如下: 这个循环是线性的,所以不能对数组中的每个槽进行并行化,但是不同的槽是独立更新的。因此,Matlab 自然会使用 CPU 的所有内核以并行方式执行诸如此类的数组操作。

我希望在我的 NVIDIA GPU 上执行相同的计算,以便加快速度(利用那里更多的内核)。

问题是: 天真地做着

tic 
Array=gpuArray(zeros(1,1000));
for j=1:100000 
    Array=Array+gpuArray(rand(1,1000));  
end  
toc 

导致计算时间延长了 8 倍更长

一个。我做错了什么?

更新: 湾。也许有人可以提供一个不同的 简单 示例,GPU 计算对哪个有益?我的目标是了解如何在 Matlab 中利用它进行非常“繁重”的随机模拟(对大数组和矩阵进行多重线性运算)。

【问题讨论】:

标签: matlab for-loop parallel-processing


【解决方案1】:

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

rand(1, 10000, 'gpuArray')

一般来说,GPU 上的随机数生成比 CPU 上快得多。

您可以使用arrayfungpuArray 版本更进一步,它将主体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

【讨论】:

  • @Ederic 谢谢,但似乎有问题,当我运行您的代码时,我得到:“使用 gpuArray/arrayfun 时出错,无法解析函数句柄。”。你能看看是什么问题吗?
  • 您需要 iFcn 成为 MATLAB 路径上的函数,可以在其自己的文件中,或者(在支持脚本内函数的最新版本的 MATLAB 中)与 arrayfun 调用一起在脚本文件中。在 R2017b 中,将整个文本放入单个脚本文件中应该可以工作。
【解决方案2】:

什么都没有。

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

您的代码目前几乎没有改进的余地。

【讨论】:

  • 谢谢。遗憾。当然我只是试着给出一个简单的测试用例。但是,您能否提供一个不同的简单示例,让 GPU 计算受益?我的目标是了解如何在 Matlab 中使用它。
猜你喜欢
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 2015-03-15
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
相关资源
最近更新 更多