我对 GPU 编程很陌生,但由于我有一项计算密集型任务,我转向 GPU 以获得可能的性能提升。
我尝试用ArrayFire 免费版重写我的程序。它确实比我启用多线程的 CPU 例程快,但没有达到我预期的程度(即 < 100% 加速),并且返回的结果不太正确(与 CPU 例程相比,误差 < 1%,假设CPU 例程的结果是正确的)。
我的任务主要是对大型矩阵(300MB-500MB 大小)进行元素方式的 float-32 数学运算,很少有 if-thens/switch-cases 等。我猜性能瓶颈可能是 CPU 和 GPU 内存之间的带宽,因为有大量数据读取等。我测试的 GPU 是 GeForce 580GTX,具有 3GB 显存。
如果我编写原始 CUDA 代码(使用 CUBLAS 等和平均优化)而不是使用 ArrayFire 来完成我的任务,是否还有很大的优化空间?我阅读了一些 NVIDIA 优化指南;似乎有一些内存访问技巧可以加快数据访问速度并减少银行冲突。ArrayFire 是否自动使用这些通用技巧?