2011-10-21 7 views
7

He trabajado un poquito en OpenCL ahora pero recientemente "clBuildProgram" falló en uno de mis programas. Mi extracto de código es el siguiente:clBuildProgram falló con el código de error -11 y sin registro de compilación

cl_program program; 
program = clCreateProgramWithSource(context, 1, (const char**) &kernel_string, NULL, &err); 
if(err != CL_SUCCESS) 
{ 
cout<<"Unable to create Program Object. Error code = "<<err<<endl; 
exit(1); 
} 
if(clBuildProgram(program, 0, NULL, NULL, NULL, NULL) != CL_SUCCESS) 
{ 
cout<<"Program Build failed\n"; 
size_t length; 
char buffer[2048]; 
clGetProgramBuildInfo(program, device_id[0], CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &length); 
cout<<"--- Build log ---\n "<<buffer<<endl; 
exit(1); 
} 

Normalmente anterior llegué sintaxis u otros errores dentro de archivos del kernel aquí con la ayuda de "clGetProgramBuildInfo()" función siempre "clBuildProgram" No se pudo, pero cuando este programa se ejecuta, en la consola sólo impresiones:

Programa compilación falló --- --- Construir registro

Y cuando traté de imprimir el código de error devuelto por "clBuildProgram"; es "-11" ...... ¿Cuál puede ser el problema con mi archivo kernel que no obtengo ninguna información de compilación fallida?

Respuesta

9

Puede aprender el significado de los códigos de error OpenCL buscando en cl.h. En este caso, -11 es justo lo que esperaría, CL_BUILD_PROGRAM_FAILURE. Ciertamente es curioso que el registro de compilación esté vacío. Dos preguntas:

1.) ¿Cuál es el valor de retorno de clGetProgramBuildInfo?

2.) ¿En qué plataforma estás? Si está utilizando la implementación OpenCL de Apple, podría intentar configurar CL_LOG_ERRORS = stdout en su entorno. Por ejemplo, desde la Terminal:

$ CL_LOG_ERRORS = stdout ./myprog

También es muy fácil de configurar esto en Xcode (Editar Esquema -> Argumentos -> Variables de entorno).

3

Si está utilizando el C en lugar de C++:

err = clBuildProgram(program, 0, NULL, NULL, NULL, NULL); 

////////////////Add the following lines to see the log file/////////// 

if (err != CL_SUCCESS) { 
char *buff_erro; 
cl_int errcode; 
size_t build_log_len; 
errcode = clGetProgramBuildInfo(program, devices[0], CL_PROGRAM_BUILD_LOG, 0, NULL, &build_log_len); 
if (errcode) { 
      printf("clGetProgramBuildInfo failed at line %d\n", __LINE__); 
      exit(-1); 
     } 

    buff_erro = malloc(build_log_len); 
    if (!buff_erro) { 
     printf("malloc failed at line %d\n", __LINE__); 
     exit(-2); 
    } 

    errcode = clGetProgramBuildInfo(program, devices[0], CL_PROGRAM_BUILD_LOG, build_log_len, buff_erro, NULL); 
    if (errcode) { 
     printf("clGetProgramBuildInfo failed at line %d\n", __LINE__); 
     exit(-3); 
    } 

    fprintf(stderr,"Build log: \n%s\n", buff_erro); //Be careful with the fprint 
    free(buff_erro); 
    fprintf(stderr,"clBuildProgram failed\n"); 
    exit(EXIT_FAILURE); 
} 
0

me encontré con el mismo problema con un archivo de registro vacío. Estaba probando mi kernel ocl en una computadora diferente. Tenía 2 plataformas en lugar de una. Una GPU Intel y una GPU AMD. Solo tenía AMD OCL SDK instalado. La instalación de Intel OCL SDK solucionó el problema. También se solucionó la selección de la plataforma AMD en lugar de la plataforma Intel GPU.

Cuestiones relacionadas