#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.