我们有一个非结构化四面体网格文件,包含以下格式:
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个线程。
在库达文件中,我们有
__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); 有谁可以帮我?
发布于 2011-11-27 13:31:36
我不知道当您发布的代码不完整且不可编译时,您如何期望任何人告诉您可能出了什么问题,但是如果在您的单个块情况下,您确实在像您发布的那样调用内核,这就是应该发生的情况:
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因此,不管您的代码在使用多个块运行时是否会中断,您对于单个块情况的结果可能是错误的,因此您的问题的全部要点可能是无关紧要的。
如果你想要一个更好的答案,编辑你的问题,让它包含一个完整的问题描述和简洁,完整的代码,实际上可以编译。否则,从你提供的信息来看,这几乎是任何人都能猜到的。
发布于 2011-11-27 15:42:49
对于2048年的每个分区大小,
包含唯一的nod1 nod2 nod3 nod4值。
但是在两个分区集中,是否会出现相同的节点索引?如果在两个不同的街区
第1项:ax[1234]=do something
第2项:ax[1234]=do something else
闻起来像种族的味道。你永远不知道这两个街区中哪一个写起来更快.
https://stackoverflow.com/questions/8284773
复制相似问题