ArrayFire与原始CUDA编程?

时间:2012-09-29 21:47:57

标签: cuda gpu arrayfire

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

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

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

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

1 个答案:

答案 0 :(得分:20)

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

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

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

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

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

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

很高兴在发布代码后扩展我的答案。