【发布时间】:2017-03-10 08:23:02
【问题描述】:
这是 cuda 线程、内存管理的问题,它返回单线程结果“100”,但预计 9 个线程结果“900”。
#indudel <stdio.h>
#include <assert.h>
#include <cuda_runtime.h>
#include <helper_functions.h>
#include <helper_cuda.h>
__global__
void test(int in1,int*ptr){
int e = 0;
for (int i = 0; i < 100; i++){
e++;
}
*ptr +=e;
}
int main(int argc, char **argv)
{
int devID = 0;
cudaError_t error;
error = cudaGetDevice(&devID);
if (error == cudaSuccess)
{
printf("GPU Device fine\n");
}
else{
printf("GPU Device problem, aborting");
abort();
}
int* d_A;
cudaMalloc(&d_A, sizeof(int));
int res=0;
//cudaMemcpy(d_A, &res, sizeof(int), cudaMemcpyHostToDevice);
test <<<3, 3 >>>(0,d_A);
cudaDeviceSynchronize();
cudaMemcpy(&res, d_A, sizeof(int),cudaMemcpyDeviceToHost);
printf("res is : %i",res);
Sleep(10000);
return 0;
}
它返回: GPU 设备正常\n 分辨率为:100
是否期望它返回更高的数字,因为 3x3(块,线程),只插入一个线程的结果? 哪里做错了,数字在哪里丢失了?
【问题讨论】:
-
您可能在写信给
*ptr时遇到了竞争条件。改用atomicAdd的原子加法。
标签: cuda gpgpu race-condition atomic