Некоторая проблема с Atomic add в работе ядра CUDA

У меня проблема с моим классом 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);
    }
}

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


person Custodio    schedule 13.05.2011    source источник


Ответы (2)


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

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

и посмотреть, что происходит.


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

person talonmies    schedule 13.05.2011
comment
Кроме того, некоторые атомарные операции поддерживаются только устройствами с вычислительными возможностями выше текущего значения по умолчанию (например, поддерживаются только cc 3.5, тогда как текущее значение по умолчанию — 2.0). В этих случаях по-прежнему необходимо указать соответствующую опцию арки, например. -arch=sm_35, и, кроме того, вы не можете указать несколько параметров арки, если некоторые из них не соответствуют минимуму, необходимому для используемого атома. - person Robert Crovella; 19.03.2016

Сегодня с последним 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;
person user1392334    schedule 13.05.2012
comment
Когда вы говорите, что это решение не будет работать с последним набором инструментов, что именно вы имеете в виду? Решение показывает вызов командной строки nvcc с параметром -arch. Это по-прежнему справедливо для наборов инструментов CUDA 4.2 для Windows 7, Linux и OS X. - person talonmies; 13.05.2012