atomicAdd()
CUDA 4.0 以降の一部として明示的に for doubles が実装されていないのはなぜですか?
CUDA プログラミング ガイド 4.1の付録 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)
同じページに続いて、プロジェクトで使い始めたばかりの double 用の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 の一部として定義しないのはなぜですか?