Linux系統下CUDA中的原子操作

今天在學習《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;
	}
	
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章