爲什麼hasnt atomicAdd()
作爲CUDA 4.0或更高版本的一部分明確實施了雙打?爲什麼atomicAdd未實現雙打?
從的附錄F頁97開始,下列版本的 atomicAdd已經實現。
int atomicAdd(int* address, int val);
unsigned int atomicAdd(unsigned int* address,
unsigned int val);
unsigned long long int atomicAdd(unsigned long long int* address,
unsigned long long int val);
float atomicAdd(float* address, float val)
在同一頁接着給出一個小的實現atomicAdd的雙打如下 我已經用在我的項目剛剛開始。
__device__ double atomicAdd(double* address, double val)
{
unsigned long long int* address_as_ull =
(unsigned long long int*)address;
unsigned long long int old = *address_as_ull, assumed;
do {
assumed = old;
old = atomicCAS(address_as_ull, assumed,
__double_as_longlong(val +
__longlong_as_double(assumed)));
} while (assumed != old);
return __longlong_as_double(old);
}
爲什麼不把上面的代碼定義爲CUDA的一部分?
可能致使其每個用戶知道它的實現,因爲它不是一個內置的指令和重試邏輯可以承受活鎖(因爲沒有公平的保證,一個線程可以得到停滯不前的只要有其他線程更新相同的變量)。 – tera