tutorial programming functions example c atomic cuda

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.