【发布时间】:2011-10-27 07:01:36
【问题描述】:
下面是我编写的一个小程序,用于查看在 CUDA 中竞争条件如何发生,但我对输出感到惊讶。
#include<cutil.h>
#include<iostream>
__global__ void testLocal(int *something, int val[]){
*something = *something/2;
val[threadIdx.x] = *something;
}
void main(){
int *a, *c;
int r =16;
cudaMalloc((void**)&a, 4*sizeof(int));
cudaMalloc((void**)&c, sizeof(int));
cudaMemcpy(c, &r, sizeof(int) , cudaMemcpyHostToDevice);
testLocal<<<1,4>>>(c,a);
int *b = (int *)malloc(4 * sizeof(int));
cudaMemcpy(b,a, 4 * sizeof(int), cudaMemcpyDeviceToHost);
for( int j =0 ; j< 4; j++){
printf("%d\n",b[j]);
}
getchar();
}
当我启动 4 个线程时,我希望每个线程将 *something 除以 2 一次。我知道他们划分 *something 的顺序是不固定的。因此,当我尝试打印这些值时,我希望打印的值之一是 8,一个是 4,一个是 2,一个是 1。但是,所有打印的值都是 8。为什么会这样?不应该所有线程都划分*某事一次。
【问题讨论】:
标签: cuda parallel-processing nvidia