Pregunta

I have a CUDA C code that when I try to compile it, nvcc complains with an undefined identifier error, but the variable it really exits!

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;
}

I use the following line to compile:

nvcc -m64 -g -G `pkg-config --cflags glib-2.0`  -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -I/Developer/NVIDIA/CUDA-5.0/include -I. -o vec3-cuda.o -c vec3-cuda.cu

and I get the following:

vec3-cuda.cu(58): warning: variable "localS" was declared but never referenced

vec3-cuda.cu(64): error: identifier "localS" is undefined

vec3-cuda.cu(74): error: identifier "localS" is undefined

Any idea what happens here? I'm using CUDA 5 on OSX.

Thank you.

¿Fue útil?

Solución

this is wrong:

if (idx >= n)

curandState localS = states[idx];

You probably meant something like this:

if (idx >= n) return;

curandState localS = states[idx];

As you have it written, the scope of the variable defined within the if-clause is local to that if-clause. Since you never reference it within the if-clause, you are getting the first warning. Elsewhere, you get errors when you try to reference it outside of the scope of the if-clause.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top