正如cuda编程指南所示,我想调用AtomicAdd函数:
unsigned long long int atomicAdd(unsigned long long int* address,
unsigned long long int val);
但是,当用两个变量调用它时:
unsigned long long int *c
和unsigned long long int sum
我收到了这个错误:
dotproduct_kernel.cu(23): error: no instance of overloaded function "atomicAdd" matches the argument list
argument types are: (unsigned long long *, unsigned long long)
我不知道long long int
确实存在,所以我尝试了long int
long
,但一切都失败了。
我需要一个大数据类型,因为我的结果将接近10 ^ 14。
有关我的设备的所有信息。我猜计算能力是1.2 ,对吧?
Major revision number: 1
Minor revision number: 2
Name: GeForce GT 240
Total global memory: 1073020928
Total shared memory per block: 16384
Total registers per block: 16384
Warp size: 32
Maximum memory pitch: 2147483647
Maximum threads per block: 512
Maximum dimension 0 of block: 512
Maximum dimension 1 of block: 512
Maximum dimension 2 of block: 64
Maximum dimension 0 of grid: 65535
Maximum dimension 1 of grid: 65535
Maximum dimension 2 of grid: 1
Clock rate: 1340000
Total constant memory: 65536
Texture alignment: 256
Concurrent copy and execution: Yes
Number of multiprocessors: 12
Kernel execution timeout: Yes
这是完整的代码:
__global__ void dot (long int *a, long int *b, long int *c){
__shared__ long int temp[THREADS_PER_BLOCK];
c[0] = 0;
long index = (blockIdx.x * blockDim.x) + threadIdx.x;
temp[threadIdx.x] = a[index] * b[index];
__syncthreads();
if( 0 == threadIdx.x ){
long int sum = 0;
int i;
for( i = 0; i<THREADS_PER_BLOCK; i++) {
sum += temp[i];
}
atomicAdd(c, sum); //remember of -arch=sm_11
}
}
答案 0 :(得分:0)
确保使用-arch = sm_11或更高版本编译代码(默认情况下,它是为计算可编程性1.0编译的)。另外请注意,如果您使用SDK中的common.mk文件,因为它可能会覆盖您的一些标记。
我很抱歉,但我几乎可以确定atomicAdd的最低要求是1.1,但它似乎是1.2(你的gpu支持)。我还使用'unsigned long long'编译了你的内核('long int'不是atomicAdd的有效数据类型)。见B.11.1.1 atomicAdd()。 NVIDIA CUDA C编程指南,v3.2。
在共享上运行的原子功能 记忆和原子功能操作 64位词仅适用于 设备计算能力1.2 和 上方。
希望得到这个帮助。