使用CUDA解决涉及更复杂数据结构的问题

使用CUDA解决涉及更复杂数据结构的问题,cuda,gpu,Cuda,Gpu,所以我读了一些关于CUDA和GPU编程的书。我注意到一些事情,比如对全局内存的访问很慢(因此应该使用共享内存),扭曲中线程的执行路径不应该发散 我还研究了(密集)矩阵乘法示例,在程序员手册和。实现的技巧似乎是一样的:将计算安排在一个网格中(矩阵mul的情况已经是这样);然后将网格细分为更小的瓷砖;将磁贴提取到共享内存中,让线程尽可能长地计算,直到它需要将数据从全局内存重新加载到共享内存中 对于nbody问题,每个身体-身体相互作用的计算完全相同(第682页): 它需要两个物体和一个加速度矢量。身

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

我还研究了(密集)矩阵乘法示例,在程序员手册和。实现的技巧似乎是一样的:将计算安排在一个网格中(矩阵mul的情况已经是这样);然后将网格细分为更小的瓷砖;将磁贴提取到共享内存中,让线程尽可能长地计算,直到它需要将数据从全局内存重新加载到共享内存中

对于nbody问题,每个身体-身体相互作用的计算完全相同(第682页):

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

但是,如果我们有一个更复杂的对象,具有动态数据结构,该怎么办?现在只需假设我们有一个对象(类似于本文中介绍的body对象),其中附加了一个其他对象的列表,并且每个线程中附加的对象数量不同。如果线程的执行路径没有分歧,我如何实现这一点


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

您的问题有些笼统,因此这里有两种一般方法:

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

  • 重新组织相似的数据以适应扭曲,分歧只发生在扭曲内部,而不是跨多个扭曲

  • 经纱中的线总是同步的。如果可能和必要,将数据划分为小于33的2次幂,以避免显式同步

  • 有一些分歧是可以的

  • > P>使用C++模板,如果有帮助,帮助引导内核流。


我想只要登陆sciencedirect.com,输入cuda就是一个好的开始。自从问了这个问题,至少我读了一些有趣的文章。谢谢你的回答。
bodyBodyInteraction(float4 bi, float4 bj, float3 ai)