今天在學習《CUDA並行程序設計》第四章關於統計直方圖的例子時,在內核函數中調用了原子操作atomicAdd,以實現多個線程對競爭資源的使用。但是在編譯時出現錯誤“ error: identifier "atomicAdd" is undefined”。該錯誤解決方案如下:
(1)確定你的GPU計算能力是否在1.1或者1.1以上?如果否,那你的硬件不支持,問題無法解決;如果是,看第(2)步
(2)在用nvcc編譯時添加編譯選項”-arch=sm_12",即形如 ”nvcc -arch=sm_12 -o outFilename filename“這樣的編譯語句。另外如果你的GPU計算能力在2.0以上,也可以添加成“-arch=sm_20"編譯選項。
經過上述步驟的檢查,我的問題已經完美解決。
我程序的源代碼如下:
__global__ void myhistogram_1(char * gpu_hist_data, int * gpu_bin_data)
{
int idx = blockIdx.x * blockDim.x + threadIdx.x;
int idy = blockIdx.y * blockDim.y + threadIdx.y;
int id = idy * gridDim.x * blockDim.x + idx;
char value;
while(id < N)
{
value = gpu_hist_data[id];
//gpu_bin_data[value] ++;
atomicAdd(&gpu_bin_data[value], 1);
id += blocksPerGrid * threadsPerBlock;
}
}