CUDA Thrust与原始内核相比如何?

时间:2019-07-09 22:46:03

标签: cuda gpu thrust

我是GPU编程的新手,不确定会导致最高效的代码的原因。使用Thrust与自己编写自定义内核并自行管理内存的利弊是什么?

如果这有助于阐明我的目标是:我有一个大矩阵,对于每个值,我需要执行一些矢量运算。我知道我需要动态并行处理此任务,并且目前有一个自定义内核要通过矩阵调用其他内核。我正在考虑是否应使用Thrust调用(例如推力::: for_each)替换内核,并且/或者是否应该在内核内部使用Thrust进行矢量操作。

1 个答案:

答案 0 :(得分:4)

在过去约12个月中,我从编写CUDA内核为主到主要使用Thrust,然后回到编写CUDA内核为主。通常,编写自己的CUDA内核应提供更好的原始性能,但在较简单的测试用例中,差异应忽略不计。

推力模仿C ++ STL,因此它具有许多与STL相同的优点和缺点。也就是说,它旨在以非常通用的方式对数据向量进行操作。从这个角度来看,Thrust在某些方面比CUDA更好,但不应被视为一种万能的解决方案。 Thrust的主要优势在于抽象和可移植性等领域。您不必考虑块大小,并且很容易编写同样适用于设备或主机上数据的函子,而CUDA内核显然只能在设备内存上运行。它还有许多非常有用的算法。不必编写自己的约简或排序算法,这很好,因为Thrust提供了这些算法的非常有效的实现。但是在幕后,您的数据访问模式可能无法轻松地与Thrust的设计目标相匹配,推力在幕后往往会执行很多临时内存分配(在性能方面通常不好;您可以修改其内存管理模型来缓存这些临时分配,但我不建议您实际执行此操作,只需编写内核并完全控制您的内存使用即可。

我现在首选的工作模式是对几乎所有内容都使用CUDA,但要针对特定​​的东西使用Thrust的算法。我不想编写自己的排序或归约,所以我使用Thrust的这些以及其他操作的实现。