在this github example之后。我在尝试使用预构建的二进制文件时遇到了问题。
自收到消息PLATFORM [Apple] --> SUCCESS (1)
以来,我成功创建了二进制文件。
但是,当尝试使用二进制文件时,函数clBuildProgram
给出错误代码CL_BUILD_PROGRAM_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之后,它不再可用了。
答案 0 :(得分:0)
我不得不在另一个平台上寻求帮助,最终得到了答案。如果有人需要的话,让我分享一下:
“主要修复是在cl-compile程序中,该程序更改了保存到二进制文件的内容。它用于保存由clBuildProgram方法创建的程序,现在它保存由clCompileProgram方法创建的程序。
最重要的是,如果要保存已编译的内核,请在调用clCompileProgram方法后将其保存。在#Mojave上,如果该二进制文件先前是由clBuildProgram生成的,则无法从该二进制文件构建程序。”