使用long int的Atomic Add不起作用

时间:2011-05-26 23:30:28

标签: c cuda atomic

正如cuda编程指南所示,我想调用AtomicAdd函数:

unsigned long long int atomicAdd(unsigned long long int* address,
                             unsigned long long int val);

但是,当用两个变量调用它时:

unsigned long long int *cunsigned 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
    }
}

1 个答案:

答案 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 和   上方。

希望得到这个帮助。