有使用cuda的方法:
哪一个更适合表现或学习曲线或其他因素? 有什么建议吗?
答案 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工作站等自动并行工具,但我不建议在等式中添加更多“魔力”。