【问题标题】:CUDA kernel for Finite Element Assembly用于有限元装配的 CUDA 内核
【发布时间】:2011-11-28 08:12:35
【问题描述】:

我们有一个包含以下格式的非结构化四面体网格文件:

element-ID  nod1 nod2 nod3 nod4


    1            452  3434  322 9000

    2            2322   837 6673 2323

    .
    .
    .

300000

我们对上述网格进行了分区,每个分区大小为 2048。 对于 2048 的每个分区大小包含唯一的 nod1 nod2 nod3 nod4 值,我们在不同的起始索引处传递 1 个块和 512 个线程。

在一个 cuda 文件中,我们有

__global__ void calc(double d_ax,int *nod1,int *node2,int *nod3,int *nod4,int   start,int size)
{
    int n1,n2,n3,n4;     
    int i = blockIdx.x * blockDim.x + threadIdx.x + start;


    if ( i < size )
    {

        n1=nod1[i];
        n2=nod2[i];
        n3=nod3[i];
        n4=nod4[i];

        ax[n1] += some code;
        ax[n2] += some code;
        ax[n3] += some code;
        ax[n4] += some code;
    }
}

我们称内核为

calc<<<1,512>>>(d_ax,....,0,512);
calc<<<1,512>>>(d_ax,....,512,512);
calc<<<1,512>>>(d_ax,....,1024,512); 
calc<<<1,512>>>(d_ax,....1536,512);

上面的代码运行良好,但问题是我们一次使用多个块得到不同的结果。例如:

calc<<<2,512>>>(d_ax,....,0,1024); 
calc<<<2,512>>>(d_ax,....,1024,1024); 

谁能帮帮我?

【问题讨论】:

  • 你能编辑问题来解释为什么你不能使用更多的一个块吗?虽然您可以修复问题中的所有代码 - 它是如此不完整且充满错误,您可能还没有发布它,这对任何试图回答的人都没有帮助你的问题
  • 我已经投票决定关闭这个问题,因为它过于本地化。看起来您的问题是由于基本的编程错误和/或完全缺乏对 CUDA 基础知识的理解。这类问题不属于stackoverflow。

标签: assembly cuda element


【解决方案1】:

我不确定当您发布的代码不完整且无法编译时,您希望任何人告诉您可能有什么问题,但是 if 在您的单块情况下,您确实将内核称为你已经发布了,这就是应该发生的事情:

calc<<<1,512>>>(d_ax,....,0,512);    // process first 512 elements
calc<<<1,512>>>(d_ax,....,512,512);  // start >= 512, size == 512, does nothing
calc<<<1,512>>>(d_ax,....,1024,512); // start >= 1024, size == 512, does nothing
calc<<<1,512>>>(d_ax,....1536,512);  // start >= 1536, size == 512, does nothing

因此,无论您的代码在使用多个块运行时是否可能被破坏,您对单个块情况的结果都可能是错误的,因此您的问题的全部意义可能是无关紧要的。

如果您想要更好的答案,请编辑您的问题,使其包含对问题的完整描述以及可以实际编译的简洁、完整的代码。否则,这与任何人都可以从您提供的信息中猜到的一样多。

【讨论】:

  • size 是要处理的元素个数
  • @Krakesh:我明白这一点,但根据您发布的代码,您仅在 blockIdx.x * blockDim.x + threadIdx.x + start &lt; size 执行求和计算时,除了第一个块之外,您调用它时永远不会为真与size=512
【解决方案2】:

对于每个大小为 2048 的分区包含唯一的 nod1 nod2 nod3 nod4 价值观

但是在两个分区集中可以出现相同的节点索引吗? 如果在两个不同的块中你有

第 1 块: ax[1234]=do something

第 2 块: ax[1234]=do something else

它闻起来像是一种比赛条件。你永远不知道这两个块中的哪一个会更快编写......

【讨论】:

    猜你喜欢
    • 2012-05-13
    • 2016-10-29
    • 2017-07-06
    • 2012-04-06
    • 2014-01-02
    • 2013-08-28
    • 2011-08-24
    • 2014-04-06
    • 2013-09-17
    相关资源
    最近更新 更多