Cuda nvcc:错误:标识符未定义,但它';定义

Cuda nvcc:错误:标识符未定义,但它';定义,cuda,compiler-errors,nvcc,Cuda,Compiler Errors,Nvcc,我有一个CUDAC代码,当我试图编译它时,nvcc抱怨有一个未定义的标识符错误,但它确实存在变量 extern "C" void vRand3f_cuda (vec3f *d_v, int n) { curandState *d_states; CUDA_CALL (cudaMalloc ((void **)&d_states, n * sizeof (curandState))); dim3 gDim (1); dim3 bDim (n);

我有一个CUDAC代码,当我试图编译它时,nvcc抱怨有一个未定义的标识符错误,但它确实存在变量

extern "C"
void vRand3f_cuda (vec3f *d_v, int n)
{

    curandState *d_states;
    CUDA_CALL (cudaMalloc ((void **)&d_states, n * sizeof (curandState)));

    dim3 gDim (1);
    dim3 bDim (n);

    set_seed<<<gDim, bDim>>> (d_states, time (NULL), n);
    vRand3f_cuda_generate<<<gDim, bDim>>> (d_v, d_states, n);

    CUDA_CALL (cudaFree (d_states));

}

__global__ void set_seed (curandState *states, unsigned long seed, int n)
{
    int idx = threadIdx.x + blockIdx.x * gridDim.x;
    if (idx >= n)
        return ;

    curand_init (seed, idx, 0, &states[idx]);

}

__global__ void vRand3f_cuda_generate (vec3f *v, curandState *states, int n)
{
    int idx = threadIdx.x + blockIdx.x * gridDim.x;
    if (idx >= n)

    curandState localS = states[idx];
    double s, x, y;
    s = 2.;

    while (s > 1.)
    {
        x = 2. - curand_uniform_double (&localS) - 1.;
        y = 2. - curand_uniform_double (&localS) - 1.;
        s = x * x   +   y * y;
    }

    v[idx].z = 1. - 2. * s;
    s = 2. * sqrt (1. - s);
    v[idx].x = s * x;
    v[idx].y = s * y;

    states[idx] = localS;
}
我得到以下信息:

cu(58):警告:已声明变量“localS”,但从未声明 参考

vec3 cuda.cu(64):错误:标识符“localS”未定义

vec3 cuda.cu(74):错误:标识符“localS”未定义

知道这里发生了什么吗?我在OSX上使用CUDA 5

谢谢。

这是错误的:

if (idx >= n)

curandState localS = states[idx];
你的意思可能是这样的:

if (idx >= n) return;

curandState localS = states[idx];

正如您所写的,在if子句中定义的变量的范围是该if子句的局部范围。由于您从未在if子句中引用它,因此您将得到第一个警告。在其他地方,当您尝试在if子句范围之外引用它时,会出现错误。

oh!,你说得对,我忘了“返回”。谢谢@Robert Crovella
if (idx >= n) return;

curandState localS = states[idx];