2012-02-27 11 views
14

Estoy usando la tarjeta gráfica ATI RV770, OpenCl 1.0 y ati-stream-sdk-v2.3-lnx64 en Linux.código de error (-11) :: ¿Cuáles son todas las posibles razones para obtener el error "cl_build_program_failure" en OpenCL?

Al ejecutar mi código de host que incluye las siguientes dos secciones para compilar el programa kernel, obtengo el código de error (-11), es decir, cl_build_program_failure. ¿Significa que el programa kernel compilado, si no es así, cómo se compila y depura?

const char* KernelPath = "abc_kernel.cl"; //kernel program is in separate file but in same directory of host code.. 

/* Crear un objeto Programa de la fuente del núcleo * ** * ** */

char* sProgramSource = readKernelSource(KernelPath); 
size_t sourceSize = strlen(sProgramSource) ; 
program = clCreateProgramWithSource(context, 1,(const char **) &sProgramSource,&sourceSize, &err); 
checkStatus("error while creating program",err); 

/* Construir (compilar & Enlace) Programa * ** * ***/

char* options = (char*)malloc(10*sizeof(char)); 
strcpy(options, "-g"); 
err = clBuildProgram(program, num_devices, devices_id, options, NULL, NULL); 
checkStatus("Build Program Failed", err); //This line throwing the error.... 

función para leer el programa del núcleo es el siguiente ::

archivo

/* código fuente del programa leer */

char* readKernelSource(const char* kernelSourcePath){ 
FILE *fp = NULL; 
size_t sourceLength; 
char *sourceString ; 
fp = fopen(kernelSourcePath , "r"); 
if(fp == 0) 
{ 
     printf("failed to open file"); 
     return NULL; 
} 
// get the length of the source code 
fseek(fp, 0, SEEK_END); 
sourceLength = ftell(fp); 
rewind(fp); 
// allocate a buffer for the source code string and read it in 
sourceString = (char *)malloc(sourceLength + 1); 
if(fread(sourceString, 1, sourceLength, fp) !=sourceLength) 
{ 
      printf("\n\t Error : Fail to read file "); 
      return 0; 
} 
sourceString[sourceLength+1]='\0'; 
fclose(fp); 
return sourceString; 

} // fin de readKernelSource

¿Alguien puede decir cómo solucionarlo?

¿Significa que es un error de compilación de OpenCl en tiempo de ejecución u otra cosa?

// Imprimir la información de build_log utilizando clGetProgramBuildInfo() como a continuación, pero ¿por qué no está imprimiendo nada?

char * build_log; size_t log_size;

// First call to know the proper size 
     err = clGetProgramBuildInfo(program, devices_id, CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size); 
     build_log = (char*)malloc((log_size+1)); 

     // Second call to get the log 
     err = clGetProgramBuildInfo(program, devices_id, CL_PROGRAM_BUILD_LOG, log_size, build_log, NULL); 
     build_log[log_size] = '\0'; 
     printf("--- Build log ---\n "); 
     fprintf(stderr, "%s\n", build_log); 
     free(build_log); 
+0

¿Pegó la fuente del kernel en una herramienta de terceros de algún tipo? Un perfilador tal vez? Cuando obtengo errores de compilación, generalmente son sintaxis dentro del programa mismo. – mfa

Respuesta

30

Este error suele deberse a un error de sintaxis en el código de su kernel. Puede llamar a la función OpenCL clGetProgramBuildInfo con la bandera CL_PROGRAM_BUILD_LOG para acceder al registro generado por el compilador. Este registro contiene el resultado al que probablemente esté acostumbrado al compilar en la línea de comandos (errores, advertencias, etc.).

Por ejemplo, se podría añadir algo similar a lo siguiente después de llamar clBuildProgram:

if (err == CL_BUILD_PROGRAM_FAILURE) { 
    // Determine the size of the log 
    size_t log_size; 
    clGetProgramBuildInfo(program, devices_id[0], CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size); 

    // Allocate memory for the log 
    char *log = (char *) malloc(log_size); 

    // Get the log 
    clGetProgramBuildInfo(program, devices_id[0], CL_PROGRAM_BUILD_LOG, log_size, log, NULL); 

    // Print the log 
    printf("%s\n", log); 
} 

También puede ver el buildOpenCLProgram() en SDKCommon.cpp en el AMD APP SDK para un ejemplo real.

+0

Hice lo mismo para imprimir la información build_log como se muestra arriba. Pero está imprimiendo cualquier cosa, incluso utilicé malloc() para crear almacenamiento para build_log. – Gopal

+0

Supongo que quieres decir "está ** no ** imprimiendo nada"? ¿Puedes confirmar que realmente se está llamando al printf? Es posible que tenga que inicializar el registro primero para asegurarse de que la cadena tenga terminación nula. Intente agregar "memset (log, 0, log_size);" después de la llamada a malloc. –

+0

intenté "memset ((void *) build_log, 0, sizeof (build_log));" pero en esta línea está dando una falla de segmentación ... – Gopal

Cuestiones relacionadas