2010-05-10 103 views
0

因此,我读了一些关于CUDA和GPU编程的内容。我注意到一些事情,例如访问全局内存很慢(因此应该使用共享内存),并且变形中线程的执行路径不应该偏离。用CUDA解决涉及更复杂数据结构的问题

我也看了一下(密集)矩阵乘法的例子,在程序员手册和nbody problem中描述过。实施的窍门似乎是一样的:将计算排列在一个网格中(它已经在矩阵mul的情况下);然后将网格细分为更小的图块;将磁贴获取到共享内存中,并让线程尽可能长的计算,直到它需要将数据从全局内存重新加载到共享内存中。

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

bodyBodyInteraction(float4 bi, float4 bj, float3 ai) 

它需要两个机构和加速度矢量。身体矢量有四个组成部分,它的位置和重量。阅读纸张时,计算可以很容易理解。

但是,如果我们有一个更复杂的对象,动态数据结构呢?现在假设我们有一个对象(类似于纸上的正文对象),它有一个附加的其他对象的列表,并且每个线程中附加的对象的数量是不同的。我怎么能够实现这一点,而不必让线程的执行路径发生分歧?

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

回答

2

你的问题是有点一般,所以这里几个常用的方法:

  • 垫数据,以便在相同尺寸的所有对象(例如零)

  • 重新组织你的类似数据适合经线,发散只发生在经线内,不跨越多线经线

  • 经线线始终同步。如果可能且必要的话,将数据划分为小于33的2的幂,以避免明确的同步。

  • 也没关系有一些分歧

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

+0

那么我想只是去sciencedirect.com和输入cuda是一个好的开始。至少我在提出这些问题之后阅读了一些有趣的论文。 Thx为您的答案。 – Nils 2010-05-20 15:03:49