Некоторая проблема с атомарным добавлением в работе ядра CUDA

#c #atomic #cuda

#c #атомарный #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);
    }
}
  

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

Ответ №1:

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

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

и посмотрите, что произойдет.


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

Комментарии:

1. Кроме того, некоторые атомарные операции поддерживаются только устройствами с вычислительными возможностями выше, чем текущее значение по умолчанию (например, поддерживается только cc 3.5, тогда как текущее значение по умолчанию равно 2.0). В этих случаях все еще необходимо указать соответствующий параметр arch, например. -arch=sm_35 и, кроме того, вы не можете указать несколько параметров arch, если некоторые из них не соответствуют минимуму, необходимому для используемого atomic.

Ответ №2:

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

 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-> Устройство-> Генерация кода), например:

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

Комментарии:

1. Когда вы говорите, что это решение не будет работать с последней версией toollkit, что именно вы имеете в виду? Решение показывает nvcc вызов командной строки с -arch опцией. Это по-прежнему совершенно справедливо для наборов инструментов CUDA 4.2 для Windows 7, Linux и OS X.