【问题标题】:Error:identifer "blockIdx" is undefined错误:标识符“blockIdx”未定义
【发布时间】:2012-02-26 05:56:02
【问题描述】:

我的 CUDA 设置

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 上。我仍然可以在没有错误消息的情况下成功编译,但这些错误只是在视觉上突出显示

  • “错误:标识符“blockIdx”未定义。”
  • “错误:标识符“blockDim”未定义。”
  • “错误:标识符“threadIdx”未定义。”

这是屏幕截图。

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

我应该担心吗?是 Visual Studios 错误还是我的设置配置错误?任何帮助表示赞赏。谢谢大家!

P.S 我对 Visual Studios 和 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;
}

【问题讨论】:

  • 每行代码需要缩进4个空格,单独写一段。另外,请使用描述性标题。目前,它传达no有意义的信息。
  • @Arjun 标题已更改,希望对您有所帮助。也添加了代码。 :)
  • 这几乎总是尝试使用标准 C++ 编译器编译设备代码的症状。确保代码具有 .cu 扩展名,并且您构建的规则配置正确。

标签: visual-studio-2010 visual-c++ cuda


【解决方案1】:

代码已正确编译,它是 Visual Intellisense 试图自行解析代码并捕获错误。 我通常做的技巧是拥有一个“被黑”的头文件,它定义了所有 CUDA 特定的符号(threadIdx__device__ 等),然后将其包含在 .cu 文件中,如下所示:

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

这样,Intellisense 将读取 myhack.h 并且不会抱怨 CUDA 内容。真正的 nvcc 编译器会识别 __CUDACC__ 宏并且不会读取 hack 文件。

【讨论】:

    【解决方案2】:

    进一步了解 CygnusX1 的答案,按照 these directions 将 CUDA 关键字(如 blockDim)添加到 Visual Studio 2010 的 usertype.dat 文件中。

    这应该可以消除这些关键字的 Intellisense 错误。

    【讨论】:

      【解决方案3】:

      只是VS自己做的一个关键字Visual Intellisense问题。代码可以构建成功,因为VS请求NVCC,谁能找到并识别这些关键字来做构建工作,你可以在VS2010下添加以下代码来解决这个问题

       #include "device_launch_parameters.h"
      

      【讨论】:

      • 那么__syncthreads 呢?还有其他要包含的标题吗?
      【解决方案4】:

      我仍然可以在没有错误消息的情况下成功编译,但这些错误只是在视觉上突出显示。

      就我而言,我实际上无法使用 Visual Studio 2017 进行编译;


      但是,This answer 解决了它。特别是:

      ma​​in.cpp 文件的上下文菜单中,单击重命名并将其重命名为 .cu。

      在 .cu 文件(您刚刚重命名)的上下文菜单中,选择“属性”。然后转到 General 并确保 Item Type 设置为 CUDA C/C++。

      【讨论】:

        猜你喜欢
        • 2014-06-05
        • 2015-05-12
        • 2011-10-23
        • 1970-01-01
        • 2020-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多