为什么在Matlab中,gpuArray的repmat和reshape运行速度如此缓慢?

3

我当前的任务是使用GPU同时训练多个网络。由于现在无法完成此任务,因此我尝试对数组进行一些操作。

a = rand(1000, 1000, 'gpuArray');
tic; for i = 1 : 100 a .* a; end; toc;                 % line 1
tic; for i = 1 : 100 repmat(a, 3, 10); end; toc;       % line 2
tic; for i = 1 : 100 reshape(a, 10, 10000); end; toc;  % line 3

b = rand(1000, 1000);
tic; for i = 1 : 100 b .* b; end; toc;                 % line 4
tic; for i = 1 : 100 repmat(b, 3, 10); end; toc;       % line 5
tic; for i = 1 : 100 reshape(b, 10, 10000); end; toc;  % line 6

所以line 1line 4慢,但line 2line 5慢,并且line 3line 6慢。对于许多其他大小的数组,可以看到CPU在repmatreshape方面比GPU更快。有人能解释一下我应该怎么做才能获得预期的加速吗?

1
不要在GPU上修改数据。将数据传输到GPU(并对其进行修改)是使用GPU时最慢的两个部分。 - Suever
那么,除了“reshape”和“repmat”,我应该做什么呢? - user7484269
你应该使用 reshaperepmat 在本地创建数据,然后在其大小被设置后将其转换为 gpuArray - Suever
好的,我应该创建相应的数组 a1 = zeros(3 * size(a, 1), 10 * size(a, 2), 'gpuArray')。那么复制数据的最快方式是什么?对于重塑后的数组,同样的问题也存在。 - user7484269
1个回答

1
如果您看到了什么惊人的事情,那么您所看到的只是异步执行。a .* a退出时实际上并没有做任何事情,它只是在GPU上启动了计算。因此,您所测量的时间只是将100个内核排队执行所需的时间。您需要使用gputimeitwait(gpuDevice)来获取代码中正确的计时。也许在执行repmat时已经达到了队列限制,所以MATLAB被迫等待一些乘法运算完成,但我不能确定。
a = rand(1000, 1000, 'gpuArray');
b = gather(a);

fprintf('Times for @times: ');
fprintf('GPU: %f secs  ', gputimeit(@()a.*a));
fprintf('CPU: %f secs\n', timeit(@()b.*b));

fprintf('Times for @repmat: ');
fprintf('GPU: %f secs  ', gputimeit(@()repmat(a,3,10)));
fprintf('CPU: %f secs\n', timeit(@()repmat(b,3,10)));

fprintf('Times for @reshape: ');
fprintf('GPU: %f secs  ', gputimeit(@()reshape(a,10,100000)));
fprintf('CPU: %f secs\n', timeit(@()reshape(b,10,100000)));

而输出:

Times for @times: GPU: 0.000382 secs  CPU: 0.001642 secs
Times for @repmat: GPU: 0.005186 secs  CPU: 0.032809 secs
Times for @reshape: GPU: 0.000053 secs  CPU: 0.000002 secs

reshape 可能在 CPU 上真的更快(虽然差距微乎其微),因为调用对象上的方法比直接检查或修改数组属性要花费更长的时间。但是实际上,对于任何真正的 GPU 应用程序来说,它的速度非常快,以至于不重要。

如果您在设备上没有看到类似的数字,则无疑与您的 GPU 质量有关。 repmat 是一个高内存带宽函数 - 也许您拥有一张游戏卡或笔记本电脑芯片,其双精度数组性能非常差?您可以尝试在 single 中运行,看看情况是否会有所改善。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接