我对GPU编程非常陌生,但是由于我要执行计算量大的任务,因此我转向了GPU,以寻求可能的性能提升。
我尝试用ArrayFire Free版本重写程序。它的确比启用多线程的CPU例程快,但没有达到我期望的程度(即
我的任务主要是在大型矩阵(300MB-500MB大小)上进行元素明智的float-32数学运算,而if-thens / switch-case等情况很少。我猜想性能瓶颈可能是CPU和GPU内存之间的带宽,因为存在大量的数据读取等。我测试的GPU是具有3GB视频内存的GeForce 580GTX。
如果我编写原始的CUDA代码(使用CUBLAS等进行平均优化),而不是使用ArrayFire进行任务,那么还有大量的优化空间吗?我阅读了一些NVIDIA优化指南;似乎那里有一些内存访问技巧,可以更快地访问数据并减少存储区冲突。 ArrayFire是否自动使用这些常规技巧?
最佳答案
感谢您的帖子。很高兴听到最初的结果正在加速。我在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提供更好的结果,而是它们都以有限的精度以略有不同的方式工作。如果您使用单精度而不是双精度,则可以考虑使用。发布代码也可以帮助我们。
发布代码后,很高兴扩展我的答案。
关于cuda - ArrayFire与原始CUDA编程相比?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12656787/