__global__ voidaddKernel(int* a,int* b,int* c){int i = threadIdx.x;atomicAdd(&c[i], a[i]+ b[i]);}intmain(){int N =50;int*a,*b,*c;
a =(int*)malloc(N *sizeof(int));
b =(int*)malloc(N *sizeof(int));
c =(int*)malloc(N *sizeof(int));for(int i =0; i < N; i++){
a[i]= i;
b[i]=1;
c[i]=0;}int*a_dev,*b_dev,*c_dev;cudaMalloc((void**)&a_dev, N *sizeof(int));cudaMalloc((void**)&b_dev, N *sizeof(int));cudaMalloc((void**)&c_dev, N *sizeof(int));cudaMemcpy(a_dev, a, N *sizeof(int), cudaMemcpyHostToDevice);cudaMemcpy(b_dev, b, N *sizeof(int), cudaMemcpyHostToDevice);
addKernel <<<1, N >>>(a_dev, b_dev, c_dev);cudaMemcpy(c, c_dev, N *sizeof(int), cudaMemcpyDeviceToHost);for(int i =0; i < N; i++){printf("c[%d] = %d\n", i, c[i]);}cudaFree(a_dev);cudaFree(b_dev);cudaFree(c_dev);free(a);free(b);free(c);return0;}
上面示例中,定义了一个 addKernel函数,它会在每个线程中使用原子加函数 atomicAdd 来将 b[i] 的值加到 a[i] 上,并将结果存储在 c[i] 中。在 main 函数中,我们分配了 CPU 端和 GPU 端的内存空间,并将数据传输到 GPU 端。我们通过 addKernel 函数在 GPU 上执行并获得结果,最后将计算结果传输回 CPU 并输出。