2017-06-03 24 views
0

根据[此] [1]手动,要构建或不建Offlline编译后的二进制中的OpenCL

[1]:

以从在线改变编译的方法脱机时,>以下步骤如下: 1.Read内核为二进制 2.切换到clCreateProgramWithSource()clCreateProgramWithBinary() 3.摆脱clBuildProgram()

我的问题是关于第三点。我有一个函数create_binary_kernel,它创建并(据说)也构建它,以便我可以使用它。像:

program = clCreateProgramWithSource(context,1,(const char **) 
&source_str, (const size_t *)&source_size, &err); 

clBuildProgram(program, 1, &device, NULL, NULL, NULL); 
FILE *f; 
char *binary; 
    size_t binary_size; 

clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, sizeof(size_t), &binary_size, NULL); 
binary = malloc(binary_size); 
clGetProgramInfo(program, CL_PROGRAM_BINARIES, binary_size, &binary, NULL); 
f = fopen(BIN_PATH, "w"); 
fwrite(binary, binary_size, 1, f); 
fclose(f); 

然后,另一个功能exec_kernel()创建二进制

program = clCreateProgramWithBinary(
            context, 1, &device, (const size_t *)&binary_size, 
            (const unsigned char **)&binary_buf, &binary_status, &err 
            ); 

程序但后者线之后,参考说,我并不需要使用clBuildProgram(),但如果我不这样做,它根本不起作用。每次构建它需要花费太多时间。任何帮助将非常感激。

https://www.fixstars.com/en/opencl/book/OpenCLProgrammingBook/online-offline-compilation/

回答

2

根据OpenCL specification

的OpenCL允许可执行程序使用源或 二进制来构建。 clBuildProgram必须调用程序中使用任一 clCreateProgramWithSourceclCreateProgramWithBinary构建 程序可执行用于与节目相关联的一个或多个设备创建的。

所以你所关注的书在这方面是错误的。

+0

感谢您的回复。太糟糕了,我似乎是一本很好的参考书。那么,有没有办法去建立这个计划? – VMO

+0

如何处理二进制文件是特定于实现的。检查实施者的文档,看看是否有办法进一步减少加载时间。 – pmdj

+0

你肯定有一个选择是异步执行构建(非''pfn_notify'参数'clBuildProgram()'),并在您的应用程序中同时执行其他初始化。 – pmdj