我想使用线程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行),它们总计一次,不止一次。)
答案 0 :(得分:4)
如果myU[1]
由2个不同的线程编写,则结果未定义,您需要使用atomicAdd
获取myU[1]==2
CUDA编程指南声明:
如果由warp执行的非原子指令写入相同的指令 多个线程的全局或共享内存中的位置 warp,发生的序列化写入次数 位置取决于设备的计算能力和 哪个线程执行最终写操作是未定义的。