programming - Algunos problemas con Atomic agregar en la operación del kernel CUDA
cuda tutorial (2)
Tengo un problema con mi clase kernel.cu
Llamar a nvcc -v kernel.cu -o kernel.o
Recibo este error:
kernel.cu(17): error: identifier "atomicAdd" is undefined
Mi código:
#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);
}
}
Algunos sugieren?
Hoy, con el último kit de herramientas y SDK de cuda, esta solución no funcionará. La gente también dice que agregando:
compute_11,sm_11; OR compute_12,sm_12; OR compute_13,sm_13;
compute_20,sm_20;
compute_30,sm_30;
para CUDA en las propiedades del proyecto en Visual Studio 2010 funcionará. No es así
Debe especificar esto para el archivo .cu en sus propias propiedades (en la pestaña C ++ / CUDA-> Dispositivo-> Generación de código) como:
compute_13,sm_13;
compute_20,sm_20;
compute_30,sm_30;
nvcc
especificar una arquitectura para nvcc
que admita operaciones de memoria atómica (la arquitectura predeterminada es 1.0 que no es compatible con átomos). Tratar:
nvcc -arch=sm_11 -v kernel.cu -o kernel.o
y mira lo que pasa.
EDITAR en 2015 para notar que la arquitectura predeterminada en CUDA 7.0 es ahora 2.0, que admite operaciones de memoria atómica, por lo que esto no debería ser un problema en las versiones más nuevas de kits de herramientas.