OpenCL中的二进制编译

OpenCL中的二进制编译,opencl,opencl-c,Opencl,Opencl C,跟着。我在尝试使用预构建的二进制文件时遇到了一个问题 自从收到消息PLATFORM[Apple]-->SUCCESS(1)后,我成功地创建了二进制文件 但是,当尝试使用二进制文件时,函数clBuildProgram会给出错误代码CL\u BUILD\u PROGRAM\u FAILURE。有什么建议吗 我正在使用以下代码: int length = int_par[1]; cl_int err; // Query platforms and devices c

跟着。我在尝试使用预构建的二进制文件时遇到了一个问题

自从收到消息
PLATFORM[Apple]-->SUCCESS(1)
后,我成功地创建了二进制文件

但是,当尝试使用二进制文件时,函数
clBuildProgram
会给出错误代码
CL\u BUILD\u PROGRAM\u FAILURE
。有什么建议吗

我正在使用以下代码:

    int length = int_par[1];

    cl_int err;

    // Query platforms and devices
    cl_platform_id platform;
    err = clGetPlatformIDs(1, &platform, NULL);

    cl_device_id device;
    err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, 1, &device, NULL);

    const cl_context_properties prop[] = {
        CL_CONTEXT_PLATFORM, (cl_context_properties)platform,
        0
    };

    // Create context
    cl_context context = clCreateContext(prop, 1, &device, NULL, NULL, &err);

    // Create program
    unsigned char* program_file = NULL;
    size_t program_size = 0;
    read_file1(&program_file, &program_size, "Kernel.clbin");

    cl_program program =
    clCreateProgramWithBinary(context, 1, &device, &program_size,
                              (const unsigned char **)&program_file,
                              NULL, &err);
   if(err!=CL_SUCCESS) Rprintf("clCreateProgramWithBinary!!!!\n%s\n", err_code(err));
err = clBuildProgram(program, 1, &device, NULL, NULL, NULL);

    free(program_file);

    if (err != CL_SUCCESS)
    {
        size_t len;
        //char buffer[2048*3000];

        Rprintf("Error: Failed to build program executable!\n%s\n", err_code(err));
        clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, 0, NULL, &len);
        //char *buffer = (char *) malloc(len);
        //char *buffer = (char*)calloc(len, sizeof(char));
        char *buffer =calloc(len,sizeof(char));
        //memset(buffer, 0, len);
        clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, len, buffer, NULL);
        SEP;

        Rprintf("Build Log:\n%s\n", buffer);
        SEP;
        clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_STATUS, sizeof(char), buffer, &len);
        Rprintf("Build Status:\n%s\n", buffer);
        SEP;
        clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_OPTIONS, sizeof(char), buffer, &len);
        Rprintf("Build Options:\n%s\n", buffer);
        SEP;
        //return EXIT_FAILURE;
    }

此外,值得注意的是,该代码在Sierra OS中运行良好,但在我更新到Mojave后,它就不再运行了。

我不得不在另一个平台上寻求帮助,最终得到了答案。如果有人需要,让我分享一下:

“主要修复程序是在cl compile程序中,该程序更改了保存到二进制文件的内容。它用于保存由clBuildProgram方法创建的程序,现在它保存由clCompileProgram方法创建的程序


总之,如果您想保存已编译的内核,请在调用clCompileProgram方法后保存它。在#Mojave上,如果二进制文件以前是由clBuildProgram生成的,则无法从该二进制文件生成程序。“

您是否尝试在Mojave上加载使用Sierra的OpenCL实现创建的二进制文件?这可能是你问题的根源——我不认为用一个OpenCL实现创建的二进制文件可以在另一个OpenCL实现中加载。我正在尝试重新执行整个过程。也就是说,二进制si成功地在Mojave中预构建,但当尝试将其与“clCreateProgramWithBinary”一起使用时,如图所示,它失败了。