推动GPU编程


10

我对GPGPU编程非常陌生,所以如果这个问题不是特别合适,请原谅我。据我了解,与通常的CPU编程相比,GPU编程是一项非常复杂的工程工作。必须注意发散性问题,切片,固定的内存分配以及主机设备通信/设备计算重叠。

经过一些研究后,我发现了推力库,它似乎试图模仿C ++ STL。很好 但是,基于我非常有限的经验,并且看到了获得良好性能所需的所有微观管理,我对性能有些怀疑。能否有效地内部处理所有复杂的编程部分?一些非常著名的库(例如PETSc)似乎使用了此软件包,这使我相信它应该以某种方式出现。

我想知道,与低级CUDA编程相比,对CUDA有更多经验和推力的人能否对软件包的性能说一两句话。什么时候可以使用推力?什么时候应该切换回CUDA?


您是否考虑过ArrayFire?
arrayfire

Answers:


2

我没有推力方面的经验,但是我确实使用ViennaCL,ViennaCL是另一个高级GPU库,它几乎隐藏了所有细节。从我自己的个人基准测试中,如果您忽略在内存中移动所需的时间,则可以看到实际计算的速度提高了2倍至40倍。

什么时候应该使用CPU,推力还是CUDA,都取决于您要解决的问题,技能和可用时间。我建议从解决所有3种方法的简单问题开始,以查看它们的相对性能。然后,您可以快速编写实际的软件,对其进行基准测试,并在需要提高速度的领域中应用适当的gpu方法,而不必浪费时间编写仅能获得几分钟执行时间的CUDA软件。


这对我来说很有意义。总是必须首先进行概要分析。因此,在您的示例中,您获得的加速来自使用ViennaCL。您是否尝试过直接使用OpenCL来检查差异?
GradGuy

不,像您一样,我是GPU计算的新手。我计划在未来一两年内逐步将我的技能扩展到CUDA和OpenCL,但是目前我只使用该库。ViennaCL的文档指出,通过调整后的openCL实现可能会进一步加快速度,该实现可能会达到2x-10x的数量级,但是我了解到,内存带宽是机房中900磅的大猩猩,它真正决定了您的性能。
Godric Seer 2012年

5

我在链接的集群扩展项目中使用了Thrust。根据情况的不同,Thrust的性能可能会好于您自己滚动的低级实现(特别是reduce内核对我来说运行良好)。但是,Thrust的通用性和灵活性意味着有时需要做很多额外的复制,数组填充等操作,这在某些讨厌的情况下会大大降低它的速度。我上次使用sort它的速度与其他库(例如b40c或mgpu)相比非常慢。但是,NVIDIA一直在努力改善Thrust的算法性能,因此在将来可能不再是一个大问题。

您应该尝试同时使用Thrust和CUDA编写代码,然后使用Visual Profiler来确定哪种方法更适合您感兴趣的特定任务。不必担心针对银行冲突,指令数量等优化自己的内核,那么我将使用Thrust。它还具有使您的代码更加冗长,并使不熟悉GPU编程的人更容易阅读的附带好处。


3

推力(与大多数模板库一样)的目的是提供高级抽象,同时保留良好的甚至优秀的性能。

我建议不要过于担心性能,而要问自己是否

  • 您的应用可以通过推力实现的算法来描述,如果

  • 您喜欢编写“通用”并行代码的可能性,而无需深入研究找到与给定硬件/软件体系结构的有效映射的繁琐细节。

如果您对这两个问题都做出了肯定的回答,那么您应该能够在仅使用CUDA的实现上以更少的精力来实现您的程序。然后,您可以分析您的应用程序并确定是否值得尝试提高性能。

这就是说,我不得不承认我不喜欢“通用”编程,因为我在编写程序时愿意学习新知识。我会走另一条路:用python + numpy + scipy编写原型实现,然后为那些真正需要优化并适合在GPU上运行的代码的1%-2%添加CUDA内核。当然,这样做是需要一定的先决条件的,因为在原型设计阶段做出错误的决定(例如,不适合CUDA内核的数据结构)可能会对性能产生可怕的影响。通常,需要更多的迭代才能获得良好的代码,并且不能保证做得比推力更好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.