error C2065: 'threadIdx' : undeclared identifier

Hello,
I have download cuda 5.0,and I config it as below:

CUDA_PATH
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0
CUDA_PATH_V5_0
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0
NVCUDASAMPLES_ROOT
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v5.0
NVCUDASAMPLES5_0_ROOT
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v5.0
NVTOOLSEXT_PATH
C:\Program Files\NVIDIA GPU Computing Toolkit\nvToolsExt
Path
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\libnvvp;

vs2008
c/c++
“$(CUDA_PATH)/include”;“$(NVCUDASAMPLES_ROOT)\common\inc”
link
“$(CUDA_PATH)/lib/$(PlatformName)”;“$(NVCUDASAMPLES_ROOT)\common\lib”
input
cuda.lib cudart.lib

but when I build my code piece,it shows:
error C2065: ‘threadIdx’ : undeclared identifier.

My code piece as bellow,if you know the true bug,pls tell me,tks:

#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>

#define THREAD_N 256
#define THRESHOLD 127
global static void binarizeKernel(unsigned char *in, unsigned char *out)
{
const unsigned long offset = (blockIdx.x * THREAD_N + threadIdx.x);
unsigned long p = ((unsigned long *)in)[offset];
unsigned char b = ((unsigned char *)(&p))[0];
unsigned char g = ((unsigned char *)(&p))[1];
unsigned char r = ((unsigned char *)(&p))[2];
unsigned char mi = __min(r, __min(g, b));
unsigned char ma = __max(r, __max(g, b));
out[offset] = (((unsigned short)ma + (unsigned short)mi) > THRESHOLD * 2) ? 255 : 0;
}
extern “C” float binarizeCall(unsigned char *in, unsigned char *out, int w, int h)
{
unsigned char *device_src = 0;
unsigned char *device_dest = 0;
cudaMalloc((void **)&device_src, w * h * 3);
cudaMalloc((void **)&device_dest, w * h);
//unsigned int timer = 0;
//cutCreateTimer(&timer);
cudaMemcpy(device_src, in, w * h * 3, cudaMemcpyHostToDevice);
//cutStartTimer(timer);
binarizeKernel<<<w * h / THREAD_N, THREAD_N>>>(device_src, device_dest);
cudaThreadSynchronize();
//cutStopTimer(timer);
cudaMemcpy(out, device_dest, w * h, cudaMemcpyDeviceToHost);
//float ms = cutGetTimerValue(timer);
//cutDeleteTimer(timer);
cudaFree(device_dest);
cudaFree(device_src);
//return ms;
}

看了一下你的环境配置部分,会不会是一下原因造成的呢?

比如环境变量为:
CUDA_PATH
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\

以前的配置为:
“$(CUDA_PATH)/include”

修改为以下部分再尝试:
“$(CUDA_PATH)include”

注意下其他的配置也同样修改一下!

不行,挺奇怪的。我用VA可以直接找到定义

是否生成规则没有调整?
在你的项目名称上右键,找到生成自定义,看看是否对CUDA的选项勾选了!
另外一点就是看看内核所在文件名是否是.cu

楼主您好,看到您的帖子里。

您的报错error C2065的,据我所知,此错误是cl.exe(VC)给出的,而不是cuda的编译器。而正常情况下,您的kernel在被nvcc等一套工具给过滤/编译后,kernel里的threadIdx.x是不会让cl看到的。

所以,对您做出如下建议:
(1)检查您的该代码所在的文件是否为.cu扩展名
(2)或者检查您的此文件的类型是否为CUDA C/C++, 可以通过在solution explorer里右键点击文件,查看属性得知。

祝您编码愉快。
如果依然问题无法得到解决,欢迎继续跟帖。

请楼主先在命令行下使用nvcc编译看看,如果编译成功,那么就是VC配置的问题.如果编译不成功,应该就是相关的环境变量设置问题.