2013-03-27 32 views
2

我想知道是否有方法来优化matlab函数gather。我正在开发一个非常巨大的矩阵的Cuda代码,我注意到我必须使用的gather函数来获取我的GPU数据非常缓慢。对于2^13x2^8矩阵,大约需要3秒!Cuda中的Gpuarray/Matlab

+3

@MariusBrendmoe,[collect](http://www.mathworks.com/help/distcomp/gather.html)是matlab中将gpuArray类型从设备内存移回主机内存的函数。在matlab GPU代码中不一定有用户定义的内核。 – 2013-03-27 14:38:26

+0

你好,我正在使用GTX 680卡。而我的矩阵包含单个(在cuda中浮动)值。 – ALFRAM 2013-03-27 15:57:02

回答

3

gpuArray.gather的性能受限于您的PCI总线。您只能通过收集较少的数据(例如使用索引)来优化这一点。请注意,在更新版本的并行计算工具箱中,许多操作是异步的,但gather不是 - 因此您可能只是看到完成异步请求的时间。您可以使用wait(gpuDevice)进行检查以同步设备。

+2

我认为没有基准测试'gpuArray.gather',但做一些粗略的数学运算,2^21浮点数或双精度数组应该大约为16或32MB。这应该不需要接近3秒的传输时间,所以我认为在进行任何时间测量之前进行同步的建议是一个非常好的调查 - 无论如何,这是非matlab GPU代码的常见时序错误。我确实在一段时间内做了一些gpuArray矩阵乘法的时机,它一定是在matlab将操作暴露为异步之前,因为我只是在乘法周围使用了tic和toc。 – 2013-03-27 14:35:20