使用cuda的最佳方式

时间:2010-09-13 15:43:00

标签: cuda

有使用cuda的方法:

  1. 自动平行工具,如PGI工作站;
  2. 包装如Thrust(STL风格)
  3. NVidia GPUSDK(运行时/驱动程序API)
  4. 哪一个更适合表现或学习曲线或其他因素? 有什么建议吗?

4 个答案:

答案 0 :(得分:3)

表现排名可能是3,2,1。 学习曲线为(1 + 2),3。

如果您成为CUDA专家,那么使用GPU SDK使用GPU SDK中的所有技巧,几乎不可能超越手动代码的性能,因为它可以为您提供控制。

也就是说,像Thrust这样的包装材料是由NVIDIA工程师编写的,并且在几个问题上显示出与手工卷制CUDA相比效率高达90-95 +%。它们的减少,扫描和许多很酷的迭代器也可用于解决各种各样的问题。

自动并行化工具往往不像karlphillip提到的那样具有不同的内存类型。

我首选的工作流程是使用Thrust尽可能多地编写,然后使用GPU SDK。这主要是因为没有牺牲太多性能来减少开发时间和提高可维护性。

答案 1 :(得分:2)

使用传统的CUDA SDK,性能和较小的学习曲线。

CUDA暴露了几种类型的内存(全局,共享,纹理),这些内存会对应用程序的性能产生巨大影响,在网上有很多关于它的文章。

This page非常有趣,在Dr. Dobb's上提到了关于CUDA的大量文章。

答案 2 :(得分:1)

我相信NVIDIA GPU SDK是最好的,但有几点需要注意。例如,尽量避免使用cutil.h函数,因为这些函数仅用于SDK,我个人以及其他许多函数遇到了一些问题和错误,这些都很难修复(这个“库”也没有文档,我听说NVIDIA根本不支持它)

相反,正如您所提到的,使用两个提供的API中的一个。特别推荐Runtime API,因为它是更高级别的API,因此您不必像在Device API中那样担心所有低级实现细节。

“CUDA编程指南”和“CUDA参考指南”中都详细记录了这两个API,这两个API都在每个CUDA版本中进行了更新和提供。

答案 3 :(得分:1)

这取决于你想在GPU上做什么。如果你的算法能够从推力可以提供的东西中获得极大的好处,比如减少,前缀,总和,那么推力绝对值得一试,我打赌你不能在纯CUDA C中自己更快地编写代码。

然而,如果你已经将已经并行的算法从CPU移植到GPU,那么在普通的CUDA C中编写它们可能会更容易。我已经成功完成了这条路线的成功项目,以及CPU / GPU代码实际计算几乎相同。

你可以在一定程度上结合这两种范式,但据我所知,你为每个推力调用启动新的内核,如果你想让所有的内核都在一个大的内核中(从内核开始的内核太频繁了)等式),你必须使用普通的CUDA C和SDK。

我发现纯CUDA C实际上更容易学习,因为它让您对GPU上发生的事情有了很好的理解。 Thrust在你的代码行之间增加了很多魔法。

我从未使用PGI工作站等自动并行工具,但我不建议在等式中添加更多“魔力”。