[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]