Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用gparray在Matlab中加速仿真_Matlab_For Loop_Parallel Processing - Fatal编程技术网

用gparray在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

我有一个更新阵列的Matlab仿真:

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中,将整个文本放在单个脚本文件中应该是可行的。