使用thread.x的CUDA atomicAdd未返回预期结果

使用thread.x的CUDA atomicAdd未返回预期结果,cuda,Cuda,我一直在CUDA中尝试原子操作,但我无法将线程索引号包含在操作中,看起来它们只是被视为零,如下面的示例所示: 下面的代码中是否有我做错的地方 代码1:将线程索引值添加到dest[10]不起作用,dest[10]在运行后为0,我希望它大于0,因为每次都会将索引值添加到dest[10] __global__ void add_test(int* dest, float *a, float *b, float *c) { int ix = ((blockIdx.x * blockDim.x)

我一直在CUDA中尝试原子操作,但我无法将线程索引号包含在操作中,看起来它们只是被视为零,如下面的示例所示:

下面的代码中是否有我做错的地方

代码1:将线程索引值添加到dest[10]不起作用,dest[10]在运行后为0,我希望它大于0,因为每次都会将索引值添加到dest[10]

__global__ void add_test(int* dest, float *a, float *b, float *c)
{
    int ix = ((blockIdx.x * blockDim.x) + threadIdx.x);
    int idx = threadIdx.x;
    atomicAdd(dest+10,idx);
}
代码2:如果我使用一个常量,那么它似乎在run dest[10]=2结束时起作用,但我还是希望它大于2,因为它应该为每个正在运行的线程/块添加2:

__global__ void add_test(int* dest, float *a, float *b, float *c)
{
    int ix = ((blockIdx.x * blockDim.x) + threadIdx.x);
    int idx = threadIdx.x;
    atomicAdd(dest+10,2);
}
我的测试调用如下所示:

add_test<<<(1024,1,1), (41,1584,1)>>>

这不是有效的内核启动:

add_test<<<(1024,1,1), (41,1584,1)>>>
不能要求螺纹块尺寸为411584,1

我的猜测是,您没有执行任何操作,也没有使用cuda memcheck运行代码,因为这两个选项中的任何一个都会指示错误,并且您的内核没有正常运行

前两个维度中的最大值为512或1024,最大组合维度(即维度=总线程数的乘积)为512或1024,具体取决于GPU

将来,如果您需要有关无法工作的代码的帮助,请提供完整、可编译的代码。因此,如果你不这样做,这是你提出问题的一个有效的接近理由