【问题标题】:Solving problems involving more complex data structures with CUDA使用 CUDA 解决涉及更复杂数据结构的问题
【发布时间】:2011-02-17 21:57:07
【问题描述】:

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

我还查看了程序员手册和nbody problem 中描述的(密集)矩阵乘法示例。并且实现的技巧似乎是相同的:将计算安排在一个网格中(在矩阵 mul 的情况下已经是);然后将网格细分为更小的图块;将切片提取到共享内存中并让线程尽可能长时间地计算,直到需要将数据从全局内存重新加载到共享内存中。

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

bodyBodyInteraction(float4 bi, float4 bj, float3 ai) 

它需要两个物体和一个加速度向量。身体向量有四个分量,它的位置和重量。看论文,计算很容易理解。

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

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

【问题讨论】:

    标签: cuda gpu


    【解决方案1】:

    你的问题有点笼统,所以这里有几个通用的方法:

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

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

    • warp 中的线程始终同步。如果可能和必要,将您的数据划分为 2 小于 33 的幂,以避免显式同步。

    • 有一些分歧也没关系

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

    【讨论】:

    • 好吧,我想只要去 sciencedirect.com 并输入 cuda 是一个好的开始。自从提出这个问题以来,至少我阅读了一些有趣的论文。谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多