2012-02-03 1 views
5

La mia configurazione per CUDAErrore: identificatore "blockIdx" non è definito

Visual Studio 2010 e 2008 SP1 (richiesto da CUDA). parallelo Nsight 1.51 CUDA 4.0 RC o 3.2 e la spinta

In sostanza, ho seguito la guida su: http://www.ademiller.com/blogs/tech/2011/03/using-cuda-and-thrust-with-visual-studio-2010/

ho poi proceduto a compilare correttamente, senza messaggi di errore.

così ho provato con ulteriori esempi di codice CUDA dal web. Questi errori sono emersi su Visual Studios. Riesco ancora a compilare correttamente senza messaggi di errore, ma questi errori sono solo evidenziato visivamente

  • "Errore: identificatore 'blockIdx' viene undfined."
  • "Errore: identificatore "blockDim" è undfined."
  • "Errore: identificatore "threadIdx" è undfined."

Ecco lo screenshot.

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

Devo preoccuparmi? È un bug di Visual Studio o la configurazione di installazione è errata? Qualsiasi aiuto è apprezzato. Grazie ragazzi!

P.S Sono molto nuovo a Visual Studio e 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

È necessario far rientrare ogni riga di codice da 4 spazi e scriverlo in un paragrafo separato. Inoltre, si prega di utilizzare un titolo descrittivo. Attualmente, trasmette * no * informazioni significative. – ArjunShankar

+0

Il titolo di @Arjun è cambiato, spero che aiuti. Codice aggiunto anche. :) – f0rfun

+0

Questo è quasi sempre un sintomo del tentativo di compilare il codice del dispositivo con un compilatore C++ standard. Assicurati che il codice abbia un'estensione .cu e le regole create siano configurate correttamente. – talonmies

risposta

26

È solo un problema di Visual Intellisense di parole chiave condotto da VS stesso. I codici possono essere costruiti con successo, perché VS richiede NVCC, che può trovare e riconoscere queste parole chiave, per fare i lavori di costruzione, si può semplicemente aggiungere il seguente codice per risolvere questo problema sotto VS2010

#include "device_launch_parameters.h" 
2

il codice viene compilato correttamente, è l'Intellisense di Visual che sta cercando di analizzare gli errori di codice e di cattura di propria. Il trucco che faccio di solito è di avere un "hacked" file di intestazione che definisce tutti i simboli CUDA-specifici (threadIdx, __device__, etc.) e quindi includere nel file br in questo modo:

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

Questo modo, Intellisense leggerà in myhack.h e non si lamenterà di CUDA roba. Il vero compilatore nvcc riconoscerà la macro __CUDACC__ e non leggerà il file di hack.

1

seguito alla risposta di CygnusX1, seguire these directions per aggiungere parole chiave come CUDA blockDim al file usertype.dat per Visual Studio 2010.

Questo dovrebbe eliminare gli errori di IntelliSense per tali parole chiave.