Некоторая проблема с добавлением Atomic в работе ядра CUDA - PullRequest
3 голосов
/ 13 мая 2011

У меня проблема с моим классом kernel.cu

Вызов nvcc -v kernel.cu -o kernel.o Я получаю эту ошибку:

kernel.cu(17): error: identifier "atomicAdd" is undefined

Мой код:

#include "dot.h"
#include <cuda.h>
#include "device_functions.h" //might call atomicAdd

__global__ void dot (int *a, int *b, int *c){
    __shared__ int temp[THREADS_PER_BLOCK];
    int index = threadIdx.x + blockIdx.x * blockDim.x;
    temp[threadIdx.x] = a[index] * b[index];

    __syncthreads();

    if( 0 == threadIdx.x ){
        int sum = 0;
        for( int i = 0; i<THREADS_PER_BLOCK; i++)
            sum += temp[i];
        atomicAdd(c, sum);
    }
}

Некоторые предлагают?

Ответы [ 2 ]

14 голосов
/ 13 мая 2011

Необходимо указать архитектуру nvcc, которая поддерживает атомарные операции с памятью (по умолчанию используется архитектура 1.0, которая не поддерживает атомарные операции).Попробуйте:

nvcc -arch=sm_11 -v kernel.cu -o kernel.o

и посмотрите, что получится.


РЕДАКТИРУЙТЕ в 2015 году, чтобы отметить, что архитектура CUDA 7.0 по умолчанию теперь 2.0, которая поддерживает атомарные операции с памятью, поэтому это не должно быть проблемой в более новых версиях инструментария.

1 голос
/ 13 мая 2012

Сегодня с последним cuda SDK и инструментарием это решение не будет работать.Люди также говорят, что добавление:

compute_11,sm_11; OR compute_12,sm_12; OR compute_13,sm_13;
compute_20,sm_20;
compute_30,sm_30;

в CUDA в Свойствах проекта в Visual Studio 2010 будет работать.Это не.

Вы должны указать это для самого файла .cu в его собственных свойствах (на вкладке C ++ / CUDA-> Device-> Code Generation), таких как:

compute_13,sm_13;
compute_20,sm_20;
compute_30,sm_30;
...