所以我读了一些关于 CUDA 和 GPU 编程的内容。我注意到一些事情,例如对全局内存的访问很慢(因此应该使用共享内存),并且 warp 中线程的执行路径不应该发散。
我还查看了程序员手册和nbody 问题中描述的(密集)矩阵乘法示例。并且实现的技巧似乎是相同的:将计算安排在网格中(在矩阵 mul 的情况下已经如此);然后将网格细分为更小的图块;将切片提取到共享内存中并让线程尽可能长时间地计算,直到需要将数据从全局内存重新加载到共享内存中。
在 nbody 问题的情况下,每个身体-身体相互作用的计算是完全相同的(第 682 页):
bodyBodyInteraction(float4 bi, float4 bj, float3 ai)
它需要两个物体和一个加速度矢量。身体向量有四个分量,它的位置和重量。阅读论文时,计算很容易理解。
但是如果我们有一个更复杂的对象,具有动态数据结构呢?现在只假设我们有一个对象(类似于论文中介绍的 body 对象),它附加了一个其他对象的列表,并且每个线程中附加的对象数量不同。我怎么能在没有线程执行路径发散的情况下实现它?
我还在寻找解释如何在 CUDA 中有效实现涉及更复杂数据结构的不同算法的文献。