在Matlab量化代码的运行速度比一个快得多for循环(参见在八度一台机器上的并行计算-包,并例如在八度具体结果)
随着中说,有没有办法向量化在Matlab或倍频图所示的代码?
x = -2:0.01:2;
y = -2:0.01:2;
[xx,yy] = meshgrid(x,y);
z = sin(xx.^2-yy.^2);
在Matlab量化代码的运行速度比一个快得多for循环(参见在八度一台机器上的并行计算-包,并例如在八度具体结果)
随着中说,有没有办法向量化在Matlab或倍频图所示的代码?
x = -2:0.01:2;
y = -2:0.01:2;
[xx,yy] = meshgrid(x,y);
z = sin(xx.^2-yy.^2);
正如@Jonas指出的那样,在MATLAB提供了几个选项,其中效果最好取决于几个因素,如:
许多的elementwise操作在MATLAB多线程现在 - 在这种情况下,一般是采用PARFOR小点(除非你有多个计算机和可用的MATLAB分布式计算服务器许可证)。
需要多台机器的内存真正巨大的问题可以受益于分布式数组 。
使用GPU可以击败一台机器的多线程性能,如果你的问题是对GPU计算的合适的尺寸和类型。 量化代码往往是最自然适合通过GPU并行。 例如,你可以使用编写代码gpuArray
从并行计算工具箱就像这样和拥有一切在GPU上运行。
x = parallel.gpu.GPUArray.colon(-2,0.01,2);
y = x;
[xx,yy] = meshgrid(x,y); % xx and yy are on the GPU
z = arrayfun( @(u, v) sin(u.*u-v.*v), xx, yy );
我转换最后一行有到arrayfun
呼叫作为使用时是更有效的gpuArray
秒。
在Matlab中,只有这样,才能获得内置矢量功能,多线程是等待MathWorks公司以实现他们这样。
或者,你可以写矢量计算作为一个循环,在使用并行运行它们parfor
。
最后,许多功能都启用了GPU的 ,所以可以访问并行处理工具箱可以并行这些操作,包括减法和逐元素力量。
meshgrid
和ndgrid
如果你仍然有兴趣在寻找一个量化的实施,使meshgrid
的问题更快的基于代码,让我提出一个量化的方法bsxfun
,它的GPU移植版本。 我坚信,人们必须考虑vectorization with GPUs
是有前途的选项,以加快MATLAB
代码。 该应用代码meshgrid
或ndgrid
并且其输出是与一些的elementwise操作设定操作的完美地采用bsxfun
到这些码。 要添加到,利用GPU与bsxfun
,让它的元素与独立CUDA核心成百上千可用的工作,令它非常适合GPU实现。
为了您的具体问题,投入是 -
x = -2:0.01:2;
y = -2:0.01:2;
接下来,你有 -
[xx,yy] = meshgrid(x,y);
z = sin(xx.^2-yy.^2);
随着bsxfun
,这成为一个班轮-
z = sin(bsxfun(@minus,x.^2,y.^2.'));
GPU基准测试技巧,从采取措施,提高GPU的性能 。
%// Warm up GPU call with insignificant small scalar inputs
temp1 = sin_sqdiff_vect2(0,0);
N_arr = [50 100 200 500 1000 2000 3000]; %// array elements for N (datasize)
timeall = zeros(3,numel(N_arr));
for k = 1:numel(N_arr)
N = N_arr(k);
x = linspace(-20,20,N);
y = linspace(-20,20,N);
f = @() sin_sqdiff_org(x,y);%// Original CPU code
timeall(1,k) = timeit(f);
clear f
f = @() sin_sqdiff_vect1(x,y);%// Vectorized CPU code
timeall(2,k) = timeit(f);
clear f
f = @() sin_sqdiff_vect2(x,y);%// Vectorized GPU(GTX 750Ti) code
timeall(3,k) = gputimeit(f);
clear f
end
%// Display benchmark results
figure,hold on, grid on
plot(N_arr,timeall(1,:),'-b.')
plot(N_arr,timeall(2,:),'-ro')
plot(N_arr,timeall(3,:),'-kx')
legend('Original CPU','Vectorized CPU','Vectorized GPU (GTX 750 Ti)')
xlabel('Datasize (N) ->'),ylabel('Time(sec) ->')
相关功能
%// Original code
function z = sin_sqdiff_org(x,y)
[xx,yy] = meshgrid(x,y);
z = sin(xx.^2-yy.^2);
return;
%// Vectorized CPU code
function z = sin_sqdiff_vect1(x,y)
z = sin(bsxfun(@minus,x.^2,y.^2.')); %//'
return;
%// Vectorized GPU code
function z = sin_sqdiff_vect2(x,y)
gx = gpuArray(x);
gy = gpuArray(y);
gz = sin(bsxfun(@minus,gx.^2,gy.^2.')); %//'
z = gather(gz);
return;
作为结果显示,与GPU量化方法表现出良好的性能提升大约是4.3x
对量化CPU代码和6x
对原来的代码。 请记住,GPU必须克服所需用它建立一个最小的开销,所以看到的改善至少需要一个体面的大小输入。 我们希望,人们会探索更多的vectorization with GPUs
,因为它可以强调也不过分!