所以我读了一些关于CUDA和GPU编程的内容。我注意到一些事情,例如访问全局内存很慢(因此应该使用共享内存),并且warp中线程的执行路径不应该分歧。
我还查看了程序员手册和nbody problem中描述的(密集)矩阵乘法示例。并且实现的技巧似乎是相同的:在网格中安排计算(在矩阵mul的情况下已经存在);然后将网格细分为更小的图块;将tile添加到共享内存中,让线程尽可能长时间地计算,直到需要将数据从全局内存重新加载到共享内存中。
如果出现nbody问题,每个身体 - 身体相互作用的计算完全相同(第682页):
bodyBodyInteraction(float4 bi, float4 bj, float3 ai)
它需要两个物体和一个加速度矢量。身体矢量有四个组成部分,它的位置和重量。阅读论文时,很容易理解计算。
但是,如果我们有一个更复杂的对象,具有动态数据结构,那该怎么办?现在假设我们有一个对象(类似于论文中提供的正文对象),其中附加了其他对象的列表,并且每个线程中附加的对象数量不同。如果不让线程的执行路径发散,我怎么能实现呢?
我也在寻找文献,解释如何在CUDA中有效实现涉及更复杂数据结构的不同算法。
答案 0 :(得分:2)
你的问题有点笼统,所以这里有几个一般方法:
填充您的数据,以便所有相同大小的对象(例如零)
重新组织您的类似数据以适应扭曲,分歧仅在扭曲内发生,而不是在多个扭曲中发生
warp中的线程总是同步的。如果可能且必要,将数据划分为2小于33的幂,以避免显式同步。
可以有一些分歧
如果有帮助,请使用C ++模板来帮助指导内核流程。