Atomic Add с длинным int не работает - PullRequest
1 голос
/ 27 мая 2011

Как подсказывает руководство по программированию 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
    }
}

1 Ответ

0 голосов
/ 27 мая 2011

убедитесь, что вы компилируете свой код с параметром -arch = sm_11 или выше (по умолчанию он скомпилирован для вычисления вычислительной совместимости 1.0).Также имейте в виду, если вы используете файл common.mk, включаемый в SDK, поскольку он может переопределить некоторые из ваших флагов.

Извините, но я был почти уверен, что минимальные требования для 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 и выше.

Надеюсь, эта помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...