在cuda的__global__函数中使用原子操作时,切记不要将要被改变的变量赋初值。下面是求一个整型数组中比变量b小的数的数量的函数。就像前面说的,这段代码在开头将*n赋了一个初值0。由于cuda中的代码每个block并不是完全并行的,而是分批的,所以当新的block运行代码时,就会将之前统计的*n给重新赋值,导致不能得到一个正确的结果,并且每次运行得到的结果都不一样。
__global__ void Count_Prim(int *array, int arr_length, int b, int *n)
{
*n = 0;
int tid = threadIdx.x;
int idx = blockDim.x * blockIdx.x + tid;
if (idx < arr_length)
{
if (array[idx] <= b)
atomicAdd(n, 1);
}
}