ArrayFire与原始CUDA编程?

brb*_*002 16 cuda gpu arrayfire

我对GPU编程很陌生,但由于我有一个计算密集型的任务,我已经转向GPU以获得可能的性能提升.

我尝试使用ArrayFire Free版本重写我的程序.它确实比启用多线程的CPU例程更快,但达不到我预期的程度(即<100%加速),并且返回的结果不是很正确(假设与CPU例程相比误差<1%,假设CPU例程的结果是正确的).

我的任务主要是基于元素的float-32数学运算在大型矩阵(300MB-500MB大小)上,几乎没有if-thens/switch-cases等.我想性能瓶颈可能是CPU和GPU内存之间的带宽,因为它有我测试的GPU是GeForce 580GTX,带有3GB的视频内存.

如果我编写原始CUDA代码(使用CUBLAS等和平均优化)而不是使用ArrayFire来完成我的任务,是否还有一些重要的优化空间?我读了一些NVIDIA优化指南; 似乎有一些内存访问技巧可以加快数据访问速度并减少银行冲突.ArrayFire会自动使用这些常规技巧吗?

arr*_*ire 21

谢谢你的帖子.很高兴听到初步结果给了一些加速.我在ArrayFire上工作,可以在这里提问.

首先,这里确实需要代码来帮助任何人提供特异性帮助.你能分享你写的代码吗?

其次,您应该以下列方式考虑CUDA和ArrayFire:CUDA是一种编程GPU的方法,它使您能够编写所需的任何GPU代码.但天真的CUDA代码(通常比CPU慢)和专家,时间密集,手动优化的CUDA代码之间存在巨大差异.ArrayFire(和其他一些GPU库,例如CUBLAS)有很多人年优化倒入其中,并通常会给出比大多数正常人更好的结果将有时间来实现自己.但是,有人使用ArrayFire(或其他库)的程度也存在差异.在使用ArrayFire库调用时,可以而且应该调整变量以获得最佳性能.如果您发布代码,我们可以帮助您分享其中的一些代码.

第三,ArrayFire在依赖BLAS的函数中使用CUBLAS,因此您不太可能直接使用CUBLAS看到很多差异.

第四,是的,ArrayFire使用NVIDIA CUDA编程指南中提供的所有优化(例如,更快的数据传输和减少你提到的内存库冲突).这是大部分ArrayFire开发重点关注的地方,优化了这些事情.

最后,您注意到的数据差异可能是由于CPU与GPU计算的性质.由于它们是不同的设备,因此您经常会看到略有不同的结果.并不是CPU提供比GPU更好的结果,而是它们以稍微不同的方式处理有限的精度.如果你使用单精度而不是双精度,你可能会考虑这一点.发布代码也可以帮助我们.

发布代码后,很高兴扩展我的答案.

  • 它们都不都符合IEEE规范吗?我假设对两者都使用“单精度”应该会产生相同的结果。同样,假设计算顺序也相同。 (2认同)