问题是我想将atomicMin
应用于int数组。我的数组有6个元素,代码是:
#include <stdlib.h>
#include <stdio.h>
__global__ void kernel(int * globalmax, int * r){
int val = r[threadIdx.x];
*globalmax = atomicMin(globalmax, val);
}
int main(int argc, char **argv) {
int m = 0;
int * d_i;
int r[] = {-3, 150, 11, -1, 15, -4};
int * d_r;
cudaMalloc((void **) &d_r, sizeof( int) * 6);
cudaMalloc((void **) &d_i, sizeof(int));
cudaMemcpy(d_r, r, sizeof( int) * 6, cudaMemcpyHostToDevice);
cudaMemcpy(d_i, &m, sizeof(int) , cudaMemcpyHostToDevice);
kernel<<<1, 7>>>(d_i, d_r);
cudaMemcpy(&m, d_i, sizeof(int), cudaMemcpyDeviceToHost);
printf("%d", m);
cudaFree(d_i);
cudaFree(d_r);
return 0;
}
当我用6个线程调用内核代码时,如果最小元素位置是6,则不能返回最小元素,如果我调用7线程的内核,我得到正确的答案。这段代码有什么问题?
答案 0 :(得分:3)
您不应该尝试将旧值存储回原子变量。变化:
*globalmax = atomicMin(globalmax, val);
为:
atomicMin(globalmax, val);