Некоторая проблема с добавлением Atomic в работе ядра 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);
}
}
Некоторые предлагают?
2 ответа
Вам нужно указать архитектуру nvcc
который поддерживает атомарные операции с памятью (архитектура по умолчанию - 1.0, которая не поддерживает атомарные операции). Пытаться:
nvcc -arch=sm_11 -v kernel.cu -o kernel.o
и посмотрим, что получится.
РЕДАКТИРУЙТЕ в 2015 году, чтобы отметить, что архитектура по умолчанию в CUDA 7.0 теперь 2.0, которая поддерживает атомарные операции с памятью, так что это не должно быть проблемой в более новых версиях инструментария.
Сегодня с последним 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;