2011-05-13 18 views
8

este programa parece estar bien, pero sigo teniendo un error, ¿alguna sugerencia?Error compilando Cuda - expresión primaria esperada

Programa:

#include "dot.h" 
#include <cuda.h> 
#include <cuda_runtime.h> 
#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    int *a, *b, *c; 
    int *dev_a, *dev_b, *dev_c; 
    int size = N * sizeof(int); 

    cudaMalloc((void**)&dev_a, size); 
    cudaMalloc((void**)&dev_b, size); 
    cudaMalloc((void**)&dev_c, sizeof(int)); 

    a = (int *)malloc (size); 
    b = (int *)malloc (size); 
    c = (int *)malloc (sizeof(int)); 

    random_ints(a, N); 
    random_ints(b, N); 

    cudaMemcpy(dev_a, a, size, cudaMemcpyHostToDevice); 
    cudaMemcpy(dev_b, b, size, cudaMemcpyHostToDevice); 

    int res = N/THREADS_PER_BLOCK; 
    dot<<< res, THREADS_PER_BLOCK >>> (dev_a, dev_b, dev_c); 
    //helloWorld<<< dimGrid, dimBlock >>>(d_str); 

    cudaMemcpy (c, dev_c, sizeof(int), cudaMemcpyDeviceToHost); 

    free(a); free(b); free(c); 
    cudaFree(dev_a); 
    cudaFree(dev_b); 
    cudaFree(dev_c); 
    return 0; 
} 

el error:

DotProductCuda.cpp:27: error: expected primary-expression before '<' token
DotProductCuda.cpp:27: error: expected primary-expression before '>' token

Respuesta

12

La sintaxis para llamar <<< >>> un núcleo no es estándar de C o C++. Esas llamadas deben estar en un archivo compilado por el compilador NVCC. Esos archivos normalmente se nombran con una extensión .cu. Otras llamadas API a CUDA como cudaMalloc pueden estar en archivos regulares .c o .cpp.

+0

Responda mi pregunta acerca de <<>>, pero ahora obtengo 'DotProductCuda.cu (26): error: no se puede configurar una llamada a la función de host' ¿Alguna idea? – Custodio

+1

Sí, no ha declarado punto como kernel a nvcc, por lo que lo está tratando como una función de host implícitamente definida. – talonmies

+0

Encontré. No estoy declarando el punto como el método __global__. Las funciones de Cuda son algo así como '__global__ void dot ....' – Custodio

4

Parece que el compilador no puede reconocer el < < <, >>> sintaxis. No tengo experiencia con CUDA, pero supongo que necesita compilar este archivo con un compilador especial y no con un compilador de C común.

3

nvcc utiliza la extensión de archivo para determinar cómo procesar el contenido del archivo. Si tiene sintaxis CUDA dentro del archivo, debe tener una extensión .cu; de lo contrario, nvcc simplemente pasará el archivo intacto al compilador del host, lo que dará como resultado el error de sintaxis que está observando.

-3

¿Quizás utilizas una función de host (printf por ejemplo) dentro de kernel?

Cuestiones relacionadas