CUDA-使用线程索引多次访问数组元素

时间:2013-09-02 20:30:15

标签: arrays cuda

我想使用线程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行),它们总计一次,不止一次。)

1 个答案:

答案 0 :(得分:4)

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

CUDA编程指南声明:

  

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