【发布时间】:2022-12-11 10:47:28
【问题描述】:
我应用 atomicAdd 函数在每个数组组件中添加 10 结果与我的预期不一样。 你能告诉我为什么 list[1] 的值为 12,而我期望 11=1+10。线程总数为 5。初始数组值为
slist[0]=1
slist[1]=2
slist[2]=3
slist[3]=4
slist[4]=5
结果是
list[0]= 1, list[0]= 1
list[0]= 1, list[1]= 12
list[0]= 1, list[2]= 13
list[0]= 1, list[3]= 14
list[0]= 1, list[4]= 15
__global__ void RunAtomicAdd(int* slist, int* val)
{
int id = threadIdx.x;
slist[0] = atomicAdd((slist +id), 10);
printf("list[0]= %d, list[%d]= %d \n", slist[0], id, slist[id]);
}
【问题讨论】:
-
您的评论也令人困惑。
list[1]是 12,因为 2+10= 12。list[1]在您的示例中包含值 2。 -
我在下面从字面上回答了这个问题。
-
我在下面从字面上解释了......你的代码确实
slist[0]=为什么你期望0之外的其他人改变? -
因为你有竞争条件,
list[0]没有被自动更新
标签: cuda