2012-02-03 226 views
5

我的CUDA設置爲Error:identifer「blockIdx」is undefined

Visual Studio 2010和2008 SP1(CUDA要求)。 並行NSight 1.51 CUDA 4.0 RC或3.2和推力

基本上,我也跟着上的引導: http://www.ademiller.com/blogs/tech/2011/03/using-cuda-and-thrust-with-visual-studio-2010/

我隨後就成功編譯沒有錯誤消息。

所以我嘗試了更多的CUDA代碼示例。這些錯誤出現在Visual Studios上。我仍然可以成功編譯沒有錯誤消息,但這些錯誤只是視覺上突顯

  • 「錯誤:IDENTIFER‘’是undfined」 blockIdx 「
  • 」錯誤:標識符「blockDim」未定義。「 「
  • 」錯誤:標識符「threadIdx」未定義。「

下面是截圖。

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

我應該關心?這是一個視覺工作室的錯誤或是我的設置配置錯誤?任何幫助表示讚賞。多謝你們!

P.S我對Visual Studio和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

下解決這個問題您需要縮進的每一行編碼4個空格,並寫在一個單獨的段落中。另外,請使用描述性標題。目前,它傳達了* no *有意義的信息。 – ArjunShankar 2012-02-03 16:08:05

+0

@Arjun標題改變了,希望它有幫助。也增加了代碼。 :) – f0rfun 2012-02-03 16:12:44

+0

這幾乎總是試圖用標準C++編譯器編譯設備代碼的症狀。確保代碼具有.cu擴展名,並且您的內置規則已正確配置。 – talonmies 2012-02-03 22:43:41

回答

26

這只是VS本身進行的關鍵字Visual Intellisense問題。代碼可以成功地建成,因爲VS請求NVCC,誰可以找到並識別這些關鍵字,做建築工作,你可以添加以下代碼VS2010

#include "device_launch_parameters.h" 
2

代碼編譯正確,它是Visual Intellisense,它試圖解析代碼並捕獲錯誤。 我一般做的關鍵是要具有定義了.CU文件這樣所有特定CUDA的符號(threadIdx__device__等等),然後它包括一個「黑客」的頭文件:

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

這方式,Intellisense將在myhack.h中閱讀,不會抱怨CUDA的東西。真正的nvcc編譯器會識別__CUDACC__宏,並且不會讀取破解文件。

1

繼CygnusX1的回答,請these directions到CUDA關鍵字,如blockDim添加到您的usertype.dat文件Visual Studio 2010中

這應該消除這些關鍵字智能感知錯誤。