Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

error code (-11):: what are all possible reasons of getting error "cl_build_program_failure" in OpenCL?

Tags:

I am using ATI RV770 graphics card, OpenCl 1.0 and ati-stream-sdk-v2.3-lnx64 on linux.

While running my host code which includes following two sections to build kernel program, i am getting error code (-11) i.e. cl_build_program_failure. Does it means that kernel program compiled, if not then how is it compiled and debugged?

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

/* Create Program object from the kernel source *******/

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

/* Build (compile & Link ) Program *******/

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.... 

function to read kernel program is as follows::

/* read program source file*/

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; 

}// end of readKernelSource

Can anyone tell how to fix it?

Does it means that it is OpenCl compilation error at runtime or something else?

//Printing build_log info using clGetProgramBuildInfo() as below, But why is is not printing anything?

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); 
like image 289
Gopal Avatar asked Feb 27 '12 11:02

Gopal


1 Answers

This error is typically caused by a syntax error in your kernel code. You can call the OpenCL function clGetProgramBuildInfo with the flag CL_PROGRAM_BUILD_LOG to access the log generated by the compiler. This log contains the output you are probably used to when compiling on the command-line (errors, warnings, etc.).

For example, you could add something similar to the following after you call 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); } 

You can also see the function buildOpenCLProgram() in SDKCommon.cpp in the AMD APP SDK for a real example.

like image 169
Michael Boyer Avatar answered Sep 28 '22 17:09

Michael Boyer