关于在同一线程束中进行原子操作时出现的问题

lokpoi888 2015-05-25 11:10:26
kernel函数如下,就是将i,j,k依次传出

__global__ void atomaddTest(int * resultofadd,int3 *pos)
{
int i= threadIdx.x;
int j= blockIdx.x;
int k= blockIdx.y;
if (i<8&&i>5)
{
pos[*resultofadd].x=i;
pos[*resultofadd].y=j;
pos[*resultofadd].z=k;
atomicAdd(resultofadd,1);

}
}


主机调用函数如下

int main()
{
int *addres =(int*)malloc(1*sizeof(int));
int3 *Pos=(int3*)malloc(256*256*256*sizeof(int3));
cudaStatus=cudaMalloc((void**)&dev_addres,1*sizeof(int));
cudaStatus=cudaMalloc((void**)&dev_Pos,256*256*256*sizeof(int3));
cudaMemset(dev_addres,0,1*sizeof(int));
atomaddTest<<<grid,256>>>(dev_addres,dev_Pos);
cudaStatus=cudaMemcpy(addres,dev_addres,1*sizeof(int),cudaMemcpyDeviceToHost);
cudaStatus=cudaMemcpy(Pos,dev_Pos,256*256*256*sizeof(int3),cudaMemcpyDeviceToHost);
}

之后传出的结果Pos中只有索引是二的整数倍的地方是正确的结果,其他的都是初始值,使用nsight调试的时候,发现i=6和i=7两个线程是连着的(在同一线程束中),在调试的时候执行完i=6这句之后,resultofadd直接加2,跳过了i=7的线程,所以pos就没被赋值,求大神解答,跪谢
...全文
191 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

580

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧