用gparray在Matlab中加速仿真
我有一个更新阵列的Matlab仿真:用gparray在Matlab中加速仿真,matlab,for-loop,parallel-processing,Matlab,For Loop,Parallel Processing,我有一个更新阵列的Matlab仿真: Array=zeros(1,1000) 详情如下: for j=1:100000 Array=Array+rand(1,1000) end 我的问题如下: 此循环是线性的,因此无法对阵列中的每个插槽进行并行化,但不同的插槽会独立更新。因此,Matlab自然会使用CPU的所有内核在parralell中执行这样的数组操作 我希望在我的NVIDIA GPU上执行相同的计算,以便加速(利用那里的更多内核) 问题是: 那太天真了 tic Array=gp
Array=zeros(1,1000)
详情如下:
for j=1:100000
Array=Array+rand(1,1000)
end
我的问题如下:
此循环是线性的,因此无法对阵列中的每个插槽进行并行化,但不同的插槽会独立更新。因此,Matlab自然会使用CPU的所有内核在parralell中执行这样的数组操作
我希望在我的NVIDIA GPU上执行相同的计算,以便加速(利用那里的更多内核)
问题是:
那太天真了
tic
Array=gpuArray(zeros(1,1000));
for j=1:100000
Array=Array+gpuArray(rand(1,1000));
end
toc
结果计算时间延长了8倍
a。我做错了什么?
更新:
B也许有人能提供一个不同的简单的示例,GPU计算对其有益吗?我的目标是了解如何在Matlab中利用它进行非常“沉重”的随机模拟(对大型阵列和矩阵的多重线性运算)。什么都没有
这就是GPU计算的工作原理。不幸的是,这不是魔法。CPU-GPU通信速度慢,非常慢。每次迭代,您都在CPU上创建一个数组并将其发送到GPU,这是最慢的部分。我确信CPU“+”运算速度快得离谱,在GPU中甚至更快,但这种改进完全被发送信息到GPU所需的时间所掩盖
您的代码目前几乎没有改进的余地 没什么
这就是GPU计算的工作原理。不幸的是,这不是魔法。CPU-GPU通信速度慢,非常慢。每次迭代,您都在CPU上创建一个数组并将其发送到GPU,这是最慢的部分。我确信CPU“+”运算速度快得离谱,在GPU中甚至更快,但这种改进完全被发送信息到GPU所需的时间所掩盖
您的代码目前几乎没有改进的余地 这可能无助于提高总体速度(正如@Ander在回答中提到的),但您可以做的一个小改进是直接在GPU上构建随机数,如下所示:
rand(1, 10000, 'gpuArray')
一般来说,GPU上的随机数生成比CPU上的快得多
您可以进一步使用gpuArray
版本的arrayfun
,JIT将主体编译为本机GPU代码。在我的GPU(特斯拉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
它可能对整体速度没有帮助(正如@Ander在他的回答中提到的),但您可以做的一个小改进是直接在GPU上构建随机数,如下所示:
rand(1, 10000, 'gpuArray')
一般来说,GPU上的随机数生成比CPU上的快得多
您可以进一步使用gpuArray
版本的arrayfun
,JIT将主体编译为本机GPU代码。在我的GPU(特斯拉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
谢谢可怜。当然,我只是试着给出一个简单的测试用例。然而,你能提供一个不同的简单例子,GPU计算是有益的吗?我的目的是了解如何在Matlab中使用它。谢谢。可怜。当然,我只是试着给出一个简单的测试用例。然而,你能提供一个不同的简单例子,GPU计算是有益的吗?我的目标是了解如何在Matlab中使用它。可能相关的Q&A(如果您的问题是生成随机数):可能相关的Q&A(如果您的问题是生成随机数):@Ederic谢谢,但似乎有一个问题,当我运行您的代码时,我得到:“使用gpuArray/arrayfun的错误无法解析函数句柄。”. 你能看到问题出在哪里吗?你需要iFcn是MATLAB路径上的一个函数,在它自己的文件中,或者(在支持脚本中函数的MATLAB的最新版本中)在脚本文件和arrayfun调用中。在R2017b中,将整个文本放在单个脚本文件中应该可以。@Ederic谢谢,但似乎有一个问题,当我运行您的代码时,我得到:“使用gpuArray/arrayfun时出错无法解析函数句柄。”。你能看到问题出在哪里吗?你需要iFcn是MATLAB路径上的一个函数,在它自己的文件中,或者(在支持脚本中函数的MATLAB的最新版本中)在脚本文件和arrayfun调用中。在R2017b中,将整个文本放在单个脚本文件中应该是可行的。