ArrayFire与原始CUDA编程相比如何?

18

我对GPU编程还比较陌生,但因为我有一个计算密集型的任务,所以我转向GPU以寻求可能的性能提升。

我尝试使用ArrayFire Free版本重写了我的程序。相比启用多线程的CPU例程,它确实更快,但并没有像我预期的那样(即& lt; 100%加速),而返回的结果也不太正确(与CPU例程相比误差& lt; 1%,假设CPU例程的结果是正确的)。

我的任务主要涉及大矩阵(300MB-500MB大小)上的逐元素float-32数学运算,很少有if-then/switch-case等操作。我猜测性能瓶颈可能是CPU和GPU内存之间的带宽,因为有很多数据读取等操作。我测试的GPU是一款带有3GB视频内存的GeForce 580GTX。

如果我为我的任务编写原始的CUDA代码(使用CUBLAS等和平均优化),相比于使用ArrayFire,仍有一定的优化空间吗?我读过一些NVIDIA优化指南;似乎有一些内存访问技巧可以加快数据访问速度并减少bank冲突。ArrayFire是否会自动使用这些通用技巧?

1个回答

23

感谢您的文章。很高兴听到初始结果提供了一些加速。我在 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 更好的结果,而是它们都以稍微不同的方式使用有限的精度。如果你使用单精度而不是双精度,可以考虑一下。发布代码将使我们在这方面提供帮助。

如果添加了代码,我很乐意扩展我的回答。


2
它们两个都符合IEEE规范,不是吗?我认为在两者上都使用“单精度”应该会产生相同的结果。再次假设计算顺序也相同。 - Royi

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