我是 GPU 编程的新手,不确定什么会导致最有效的代码。使用 Thrust 与编写自定义内核并自己管理内存的优缺点是什么?
如果它有助于详细说明我的目标是什么:我有一个大矩阵,其中对于每个值,我需要执行一些向量运算。我知道我需要动态并行来完成这项任务,并且目前有一个自定义内核来遍历将调用其他内核的矩阵。我正在考虑是否应该用推力调用(例如推力::for_each)替换内核和/或我是否应该在内核内部使用推力来进行向量操作。
在过去的大约 12 个月里,我从主要编写 CUDA 内核到主要使用 Thrust,然后又回到主要编写 CUDA 内核。一般来说,编写自己的 CUDA 内核应该提供更好的原始性能,但在更简单的测试用例中,差异应该可以忽略不计。
Thrust 模仿 C++ STL,因此它具有许多与 STL 相同的优点和缺点。也就是说,它旨在以非常通用的方式对数据向量进行操作。从这个角度来看,Thrust 在某些方面比 CUDA 更好,但不应被视为一刀切的解决方案。Thrust 的主要优势在于抽象和可移植性等领域;您不必考虑块大小,并且很容易编写同样适用于设备或主机上数据的函子,而显然 CUDA 内核只能对设备内存进行操作。它还有许多非常有用的算法;不必编写自己的归约或排序算法很好,因为 Thrust 提供了非常有效的这些实现。
我现在首选的工作模式是将 CUDA 用于几乎所有事情,但深入研究特定算法(例如排序)、原型代码或我希望实现在主机或设备上同样有效的代码的 Thrust 算法.