主机与内核代码分别进行编译,以创建独立的可执行文件:即主机程序可执行文件和 FPGA 二进制文件 (.xclbin)。当运行主机应用时,它必须使用
clCreateProgramWithBinary
API 加载 .xclbin 文件。
以下代码示例显示了如何使用标准 OpenCL API 基于 .xclbin 文件构建程序。
unsigned char *kernelbinary;
char *xclbin = argv[1];
printf("INFO: loading xclbin %s\n", xclbin);
int size=load_file_to_memory(xclbin, (char **) &kernelbinary);
size_t size_var = size;
cl_program program = clCreateProgramWithBinary(context, 1, &device_id,
&size_var,(const unsigned char **) &kernelbinary,
&status, &err);
// Function
int load_file_to_memory(const char *filename, char **result)
{
uint size = 0;
FILE *f = fopen(filename, "rb");
if (f == NULL) {
*result = NULL;
return -1; // -1 means file opening fail
}
fseek(f, 0, SEEK_END);
size = ftell(f);
fseek(f, 0, SEEK_SET);
*result = (char *)malloc(size+1);
if (size != fread(*result, sizeof(char), size, f)) {
free(*result);
return -2; // -2 means file reading fail
}
fclose(f);
(*result)[size] = 0;
return size;
}
此示例执行的步骤如下:
- 从命令行实参
argv[1]
传入内核二进制文件 .xclbin。提示: 通过命令行实参来传递 .xclbin 只是其中一种方法。您也可以在主机程序中对内核二进制文件进行硬编码,使用环境变量来定义此文件,从定制初始化文件来读取它,或者也可以采用其它合适的机制。 -
load_file_to_memory
函数用于在主机存储器空间中加载文件内容。 -
clCreateProgramWithBinary
API 用于在指定上下文和器件中完成程序创建进程。