Arrays CUDA-使用螺纹';s索引以多次访问数组元素

Arrays CUDA-使用螺纹';s索引以多次访问数组元素,arrays,cuda,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 s

我想使用线程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行中),它们相加一次以上。

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

CUDA编程指南规定:

如果warp执行的非原子指令写入相同的 多个线程在全局或共享内存中的位置 在扭曲中,发生在该卷上的序列化写入数 位置根据设备和设备的计算能力而变化 执行最终写入的线程未定义


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

CUDA编程指南规定:

如果warp执行的非原子指令写入相同的 多个线程在全局或共享内存中的位置 在扭曲中,发生在该卷上的序列化写入数 位置根据设备和设备的计算能力而变化 执行最终写入的线程未定义


我使用了atomicAdd(&myU[id],1),但仍然得到了同样的错误rsualt!!然后,您可能应该提供一个完整的、可编译的代码来演示这个问题。事实上,SO期望:“关于您编写的代码问题的问题必须在问题本身中描述特定的问题,并包括复制问题的有效代码。请参阅SSCCE.org以获得指导。”我使用了atomicAdd(&myU[id],1),但我仍然得到了相同的错误rsualt!!然后,您可能应该提供一个完整的、可编译的代码来演示这个问题。事实上,SO期望:“与您编写的代码问题有关的问题必须在问题本身中描述特定问题,并包括重现问题的有效代码。请参阅SSCCE.org以获取指导。”