ArrayFire与原始CUDA编程?

ArrayFire与原始CUDA编程?,cuda,gpu,arrayfire,Cuda,Gpu,Arrayfire,我对GPU编程相当陌生,但由于我有一项计算密集型任务,我转向GPU寻求可能的性能提升 我试着用版本重写我的程序。它确实比启用多线程的CPU例程快,但没有达到我预期的程度(即

我对GPU编程相当陌生,但由于我有一项计算密集型任务,我转向GPU寻求可能的性能提升

我试着用版本重写我的程序。它确实比启用多线程的CPU例程快,但没有达到我预期的程度(即<100%加速),返回的结果也不完全正确(假设CPU例程的结果正确,与CPU例程相比,错误率<1%)

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


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

谢谢您的帖子。很高兴听到最初的结果正在加速。我在ArrayFire工作,可以在这里插话回答你的问题

首先也是最重要的一点是,这里的代码对于任何人来说都是必需的,以帮助实现特定性。你能分享你写的代码吗

其次,您应该以以下方式考虑CUDA和ArrayFire:CUDA是一种编程GPU的方法,它为您提供了编写任意GPU代码的能力。但是,幼稚的CUDA代码(通常比CPU慢)和专业的、耗时的、手工优化的CUDA代码之间有着巨大的区别。ArrayFire(以及其他一些GPU库,如CUBLAS)已经进行了多年的优化,通常会比大多数普通人有时间自己实现的结果更好。然而,人们使用ArrayFire(或其他库)的程度也存在差异。在使用ArrayFire库调用时,可以而且应该调整一些变量,以获得最佳性能。如果你发布你的代码,我们可以在这里分享一些

第三,ArrayFire在依赖BLAS的函数中使用了CUBLAS,因此直接使用CUBLAS不会有太大区别

第四,是的,ArrayFire使用英伟达CUDA编程指南中所有的优化(例如,更快的数据传输和减少内存库冲突,如您所提到的)。这就是ArrayFire开发的重点,就是优化这些东西

最后,您注意到的数据差异可能是由于CPU与GPU计算的性质造成的。由于它们是不同的设备,您经常会看到略有不同的结果。这并不是说CPU比GPU提供更好的结果,而是它们都以稍微不同的方式以有限的精度工作。如果您使用的是单精度而不是双精度,那么您可能会考虑到这一点。张贴代码也会让我们在这方面提供帮助


代码发布后,我很乐意扩展我的答案。

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