2012-02-03 24 views
5

Moje ustawienia dla CUDABłąd: identyfikator "blockIdx" jest niezdefiniowany

Visual Studio 2010 i 2008 SP1 (wymagane przez CUDA). Parallel NSight 1,51 CUDA 4.0 lub 3.2 i RC Thrust

Zasadniczo I przestrzegać instrukcji na: http://www.ademiller.com/blogs/tech/2011/03/using-cuda-and-thrust-with-visual-studio-2010/

Potem przystąpił, aby pomyślnie skompilować bez komunikatów o błędach.

Więc próbowałem z więcej przykładów kodu CUDA z sieci. Błędy te pojawiły się w Visual Studios. Wciąż mogę skompilować pomyślnie bez komunikatów o błędach, ale te błędy są tylko wizualnie wyróżnione

  • „Błąd: identifer«». Jest undfined” blockIdx
  • "Błąd: identifer" blockDim "jest niezdefiniowany."
  • "Błąd: identifer" threadIdx "jest niezdefiniowany."

Oto zrzut ekranu.

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

powinienem być zaniepokojony? Czy jest to błąd Visual Studio, czy moja konfiguracja jest zła? Każda pomoc jest doceniana. Dzięki chłopaki!

P.S Jestem bardzo nowy zarówno dla Visual Studios, jak i 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

Musisz wciąć każdy wiersz kod po 4 spacje i zapisz go w osobnym akapicie. Proszę również użyć opisowego tytułu. Obecnie przekazuje * nie * znaczące informacje. – ArjunShankar

+0

Tytuł @Arjun zmienił się, mam nadzieję, że pomaga. Dodano również kod. :) – f0rfun

+0

To prawie zawsze jest objawem próby skompilowania kodu urządzenia za pomocą standardowego kompilatora C++. Upewnij się, że kod ma rozszerzenie .cu, a twoje reguły wbudowane są poprawnie skonfigurowane. – talonmies

Odpowiedz

26

To tylko słowo kluczowe Problem Visual Intellisense przeprowadzony przez samą VS. Kody mogą być zbudowane z powodzeniem ponieważ VS żąda nvcc, który może znaleźć i rozpoznać te słowa kluczowe, aby wykonać prace budowlane, można po prostu dodać poniższy kod, żeby rozwiązać ten problem pod VS2010

#include "device_launch_parameters.h" 
2

Kod jest skompilowany poprawnie, to jest Visual Intellisense, który stara się przeanalizować kod i złapać błędów na własną rękę. Sztuką robię zazwyczaj jest mieć „hacked” plik nagłówka, który definiuje wszystkie CUDA konkretnych symboli (threadIdx, __device__, itd.), A następnie włączyć go do pliku .cu jak ten:

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

ten sposób, Intellisense przeczyta w myhack.h i nie będzie narzekać na rzeczy CUDA. Prawdziwy kompilator nvcc rozpozna makro __CUDACC__ i nie odczyta pliku hack.

1

nawiązaniu do odpowiedzi CygnusX1, wykonaj these directions dodać CUDA słowa kluczowe takie jak blockDim do pliku usertype.dat dla Visual Studio 2010.

To powinno wyeliminować błędy IntelliSense dla tych słów kluczowych.

Powiązane problemy