cuda原子函数,运行结果老是错

[table]
[tr][td]目标是测试原子函数。
程序很简单:
#define BLOCK_NUM 4
#define THRAED_NUM 4
device unsigned int x;

global void
testKernel( float * g_idata, float * g_odata, int width,int height){
x=0;
atomicAdd(&x,1);
while(x<BLOCK_NUM*THREAD_NUM);
__syncthreads();
g_odata[0]=x;
}
//调用的时候是
int main( int argc, char *argv){
CUT_DEVICE_INIT(argc,argv);
dim3 grid(BLOCK_NUM,1,1);
dim3 threads(THREAD_NUM,1,1);
int d_odata;
CUDA_SAFE_CALL(cudaMalloc((void
)&d_odata,100));

testKernel<<<grid,threads>>>(d_odata);

int h_odata;
CUDA_SAFE_CALL(cudaMallocHost((void
*)&h_odata,100));
CUDA_SAFE_CALL(cudaMemcpy( h_odata, d_odata, mem_size, cudaMemcpyDeviceToHost));
printf(“%d\t”,h_odata[0]);
CUT_EXIT(argc,argv);
}
可是结果一直不正确,while语句也不起作用。正确应该是16,总共16个线程。结果是7 12 13 9 都有

就是对全局存储器中变量使用atomicAdd,结果结果一直是错误的。
为什么,求问大牛。
[/td][/tr]
[/table]

 x=0;
  atomicAdd(&x,1);

x=0初始化是不能放在里面的,否则,每个线程都会对初始化为0,是乱序的,所以你的结果当然是不对而且不确定的。

谢谢你的回答。
修改后 运行正确了。可是我还是想问一下,那个while循环
while(x<BLOCK_NUM*THREAD_NUM);
为什么没有拦截住程序的执行?

你while语句是分号,所以是空语句。再说了为什么要用while呢,直接同步就可以啦