2012-02-03 41 views
5

Mi disposición para CUDAerror: identificador "blockIdx" no está definido

Visual Studio 2010 y 2008 SP1 (requerido por CUDA). Parallel Nsight 1,51 CUDA 4.0 RC o 3.2 y de empuje

Básicamente, i siguieron la guía en: http://www.ademiller.com/blogs/tech/2011/03/using-cuda-and-thrust-with-visual-studio-2010/

entonces procedió a compilar correctamente sin mensajes de error.

Así que probé con más ejemplos de código CUDA de la web. Estos errores surgieron en Visual Studios. Todavía puedo compilar correctamente sin mensajes de error, pero estos errores solamente se destacan visualmente

  • "Error: identificador 'blockIdx' se undfined."
  • "Error: identifer" blockDim "no está definido."
  • "Error: identifer" threadIdx "no está definido."

Aquí está la captura de pantalla.

http://i.imgur.com/RVBfW.png

¿Debo preocuparme? ¿Es un error de Visual Studios o es incorrecta la configuración de mi configuración? Cualquier ayuda es apreciada. ¡Gracias chicos!

P.S Soy muy nuevo en Visual Studios y CUDA.

// incrementArray.cu 
#include "Hello.h" 
#include <stdio.h> 
#include <assert.h> 
#include <cuda.h> 
void incrementArrayOnHost(float *a, int N) 
{ 
    int i; 
    for (i=0; i < N; i++) a[i] = a[i]+1.f; 
} 
__global__ void incrementArrayOnDevice(float *a, int N) 
{ 
    int idx = blockIdx.x*blockDim.x + threadIdx.x; 
    if (idx<N) a[idx] = a[idx]+1.f; 
} 
int main(void) 
{ 
    float *a_h, *b_h;   // pointers to host memory 
    float *a_d;     // pointer to device memory 
    int i, N = 10; 
    size_t size = N*sizeof(float); 
    // allocate arrays on host 
    a_h = (float *)malloc(size); 
    b_h = (float *)malloc(size); 
    // allocate array on device 
    cudaMalloc((void **) &a_d, size); 
    // initialization of host data 
    for (i=0; i<N; i++) a_h[i] = (float)i; 
    // copy data from host to device 
    cudaMemcpy(a_d, a_h, sizeof(float)*N, cudaMemcpyHostToDevice); 
    // do calculation on host 
    incrementArrayOnHost(a_h, N); 
    // do calculation on device: 
    // Part 1 of 2. Compute execution configuration 
    int blockSize = 4; 
    int nBlocks = N/blockSize + (N%blockSize == 0?0:1); 
    // Part 2 of 2. Call incrementArrayOnDevice kernel 
    incrementArrayOnDevice <<< nBlocks, blockSize >>> (a_d, N); 
    // Retrieve result from device and store in b_h 
    cudaMemcpy(b_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost); 
    // check results 
    for (i=0; i<N; i++) assert(a_h[i] == b_h[i]); 
    // cleanup 
    free(a_h); free(b_h); cudaFree(a_d); 

    return 0; 
} 
+0

Es necesario para sangrar cada línea de codifique por 4 espacios, y escríbalo en un párrafo separado. Además, usa un título descriptivo. Actualmente, transmite * no * información significativa. – ArjunShankar

+0

@el título de Arjun cambiado, espero que ayude. Código agregado también. :) – f0rfun

+0

Esto es casi siempre un síntoma de intentar compilar el código del dispositivo con un compilador C++ estándar. Asegúrese de que el código tenga una extensión .cu y sus reglas compiladas estén configuradas correctamente. – talonmies

Respuesta

26

Es solo una palabra clave del problema Visual Intellisense realizado por el propio VS. Los códigos pueden ser construidos con éxito debido a VS solicita NVCC, que puede encontrar y reconocer estas palabras clave, para hacer el trabajo de construcción, se puede simplemente añadir el siguiente código para resolver este problema bajo VS2010

#include "device_launch_parameters.h" 
2

El código está compilado correctamente, es el Visual Intellisense el que está tratando de analizar el código y detectar errores por sí mismo. El truco que hago normalmente es tener un archivo de cabecera "hackeado" que define todos los símbolos CUDA-específicos (threadIdx, __device__, etc.) y luego incluirlo en el archivo .cu así:

#ifndef __CUDACC__ 
#include "myhack.h" 
#endif 

Este De esta manera, Intellisense leerá en myhack.h y no se quejará sobre cosas de CUDA. El compilador de nvcc real reconocerá la macro __CUDACC__ y no leerá el archivo de hackeo.

1

con la respuesta de CygnusX1, siga these directions para añadir palabras clave como CUDA blockDim a su archivo usertype.dat para Visual Studio 2010.

Eso debería eliminar errores IntelliSense para esas palabras clave.