我在两个GPU上测试了convn:Quadro 6000和Titan都需要比cpu更长的时间。
可以在matlab中进行快速测试:
maxloop=1000;
for i=1:maxloop
output2= convn(rand(320,1), rand([6,1,300]),'full');
end
for i=1:maxloop
goutput2= convn(gpuArray.rand(320,1),gpuArray.rand([6,1,300]), 'full');
end
在CPU上需要0.52秒,而在Quadan 6000上需要7秒,在Titan上需要15秒+。
我测试的内容:
1)如果将rand输入更改为fixed,则预定义值不会有任何改进。
2)预定义GPU输出(goutput2)并没有多大帮助。
的Quadro
泰坦
我的测试与第一个答案相同:
当m = 1000时获得相同的结果; N = 100; K = 5;
经过的时间是2.367453秒。 %%%% GPU
经过的时间是27.502952秒。 %%%% CPU
我的问题是我自己的测试代码在GPU上运行得更慢的原因和原因是什么?
答案 0 :(得分:0)
乍一看似乎是问题Matlab Convolution using gpu。但是在将数据大小从[6,1,300]增加到[1000,1,1000]之后,GPU循环没有任何改进。所以它并不是关于"尺寸"数据。
当我将数据从[1000,1,1000]重新整形为[1000,1000]时,GPU运行速度更快,CPU运行速度比之前的测试慢。代码和时间如下:
clear all;
maxloop=1000;
r5=rand(5,1);
r1000=rand([1000,1,1000]); %3d array
for i=1:maxloop
cpu_output1= convn(r5, r1000,'full'); %3d cpu array
end
r1000=reshape(r1000,[1000,1000]);
for i=1:maxloop
cpu_output2= convn(r5, r1000,'full'); %2d cpu array
end
gr5=gpuArray.rand(5,1);
gr1000=gpuArray.rand([1000,1,1000]);
for i=1:maxloop
gpu_output1= convn(gr5,gr1000, 'full'); %3d gpu array
end
gr3_1000=reshape(gr1000,[1000,1000]);
for i=1:maxloop
gpu_output2= convn(gr5,gr3_1000, 'full'); %2d gpu array
end