Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么CUDA原子功能不起作用?_Cuda_Gpu Atomics - Fatal编程技术网

为什么CUDA原子功能不起作用?

为什么CUDA原子功能不起作用?,cuda,gpu-atomics,Cuda,Gpu Atomics,问题是我想对int数组应用atomicMin。我的数组有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数组应用
atomicMin
。我的数组有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;
}
#包括
#包括
__全局无效内核(int*globalmax,int*r){
int val=r[threadIdx.x];
*globalmax=原子最小值(globalmax,val);
}
int main(int argc,字符**argv){
int m=0;
int*d_i;
int r[]={-3150,11,-1,15,-4};
int*d_r;
Cudamaloc((无效**)和d_r,sizeof(内部)*6);
Cudamaloc((void**)和d_i,sizeof(int));
cudaMemcpy(d_r,r,sizeof(int)*6,cudamemcpyhostodevice);
cudaMemcpy(d_i,&m,sizeof(int),cudamemcpyhostodevice);
内核(d_i,d_r);
cudaMemcpy(&m,d_i,sizeof(int),cudamemcpydevicetoost);
printf(“%d”,m);
库达弗里(d_i);
库达弗里(d_r);
返回0;
}

当我调用带有6个线程的内核代码时,如果最小元素位置是6,那么最小元素就不能返回,如果我调用带有7个线程的内核,那么我得到了正确的答案。这段代码怎么了?

您不应该试图将旧值存储回原子变量。更改:

*globalmax = atomicMin(globalmax, val);
致:


您不应该试图将旧值存储回原子变量。更改:

*globalmax = atomicMin(globalmax, val);
致: