0

我想使用线程 id 来访问一个定义为全局变量的数组。但是我在加一时遇到了问题。看看下面:

// initial array myU[0..3]={0,0,0,0}, myindex[0..3]={0,1,1,3}
1- tid=0,1,2,3 //tid is threads index
2- id=myindex[tid]; //id=0,1,1,3
3- myU[id]=myU[id]+1; 
4- if (myU[id]>1)
     //print("id"); // it should print '1'

我想在运行第 3 行后我有 myU[0]=1, myU[1]=2 ,myU[3]=1。但是myU数组有一些奇怪的值,比如:myU[0]=0, myU[1]=1, myU[3]=3。我不知道为什么。

我的最终目标是获得 id(在第 4 行中),他们将其相加不止一次)。

4

1 回答 1

4

如果myU[1]由 2 个不同的线程编写,则结果未定义,您需要使用atomicAdd来获取myU[1]==2

CUDA 编程指南指出:

如果 warp 执行的非原子指令为多个 warp 的线程写入全局或共享内存中的同一位置,则该位置发生的序列化写入次数取决于设备的计算能力哪个线程执行最终写入是未定义的。

于 2013-09-02T20:54:41.633 回答