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