0

所以我读了一些关于 CUDA 和 GPU 编程的内容。我注意到一些事情,例如对全局内存的访问很慢(因此应该使用共享内存),并且 warp 中线程的执行路径不应该发散。

我还查看了程序员手册和nbody 问题中描述的(密集)矩阵乘法示例。并且实现的技巧似乎是相同的:将计算安排在网格中(在矩阵 mul 的情况下已经如此);然后将网格细分为更小的图块;将切片提取到共享内存中并让线程尽可能长时间地计算,直到需要将数据从全局内存重新加载到共享内存中。

在 nbody 问题的情况下,每个身体-身体相互作用的计算是完全相同的(第 682 页):

bodyBodyInteraction(float4 bi, float4 bj, float3 ai) 

它需要两个物体和一个加速度矢量。身体向量有四个分量,它的位置和重量。阅读论文时,计算很容易理解。

但是如果我们有一个更复杂的对象,具有动态数据结构呢?现在只假设我们有一个对象(类似于论文中介绍的 body 对象),它附加了一个其他对象的列表,并且每个线程中附加的对象数量不同。我怎么能在没有线程执行路径发散的情况下实现它?

我还在寻找解释如何在 CUDA 中有效实现涉及更复杂数据结构的不同算法的文献。

4

1 回答 1

2

你的问题有点笼统,所以这里有几个通用的方法:

  • 填充您的数据,以便所有相同大小的对象(例如零)

  • 重新组织您的相似数据以适合经线,分歧只发生在经线内部,而不是跨多个经线

  • 经线中的线程始终同步。如果可能且有必要,将您的数据划分为 2 小于 33 的幂,以避免显式同步。

  • 可以有一些分歧

  • 如果有帮助,请使用 C++ 模板来帮助指导内核流程。

于 2010-05-11T01:00:20.880 回答