clBuildProgram() function error...!!

I solved another problem… and I wrote a new opencl kernel source.
The new kernel source is hextile code in opencl. I want to control the hextile encoding to the openCL(GPU).
I’m changed the source code to use opencl.
When it is builded, the error is occured.

I seek this error. It is “CL_INVALID_BINARY” error.
CL_INVALID_BINARY means if program is created with clCreateWithProgramBinary and devices listed in device_list do not have a valid program binary loaded.
But I didn’t call the clCreateWithProgramBinary() function. I called clCreateProgramWithSource() function.

why is this occured the problem?

What OpenCL implementation are you using? AMD/NVidia/Apple?

Did you remember to call clBuildProgram() after you called clCreateProgramWithSource()?

First I called clCreateProgramWithSource() and then I called clBuildProgram() function.

Also I am using NVidia implementation.

Did you check if clBuildProgram returned some kind of error? Try something like this:


cl_build_status build_status;
cl_int errcode = clBuildProgram(program, num_devices, devices, options, NULL, NULL);

if(errcode != CL_SUCCESS && errcode != CL_BUILD_PROGRAM_FAILURE)
{
    panic();
}

for(i = 0; i < num_devices; ++i)
{
    do
    {
        // Query if compilation was successful
        errcode = clGetProgramBuildInfo(program, device[i], CL_PROGRAM_BUILD_STATUS,
                                            sizeof(build_status), &build_status, NULL);
        if(errcode) panic();

        if(build_status == CL_BUILD_ERROR)
        {
                // Compilation failed. Print the build log
                cl_char *build_log     = NULL;
                size_t   build_log_len = 0;

                errcode = clGetProgramBuildInfo(state->program, env->device[i], CL_PROGRAM_BUILD_LOG, 0, NULL, &build_log_len);
                if(errcode) panic();

                build_log = malloc(build_log_len + 1);
                if(!build_log)
                    panic();
                
                errcode = clGetProgramBuildInfo(program, device[i], CL_PROGRAM_BUILD_LOG, build_log_len, build_log, NULL);
                if(errcode)
                {
                    free(build_log);
                    panic();
                }

                printf("Program build failed. Build log follows:
%s", build_log);

                free(build_log);
        }
    }
    while(build_status == CL_BUILD_IN_PROGRESS);
}

Note for OpenCL experts: I’m well aware that the code above is far from ideal :slight_smile: