ホストおよびとカーネル コードは個別にコンパイルされ、ホスト プログラム実行ファイルと 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;
}
このコード例は、次を実行します。
- カーネルのバイナリ ファイル .xclbin をコマンド ライン引数
argv[1]
で渡します。ヒント: コマンド ライン引数で .xclbin を渡すのも 1 つの方法ですが、ホスト プログラムにカーネル バイナリ ファイルをコード記述したり、環境変数を使用して定義したり、カスタム初期化ファイルから読み込んだりするなどの方法を使用できます。 -
load_file_to_memory
関数を使用して、ファイルの内容をホスト マシンのメモリ空間に読み込みます。 -
clCreateProgramWithBinary
API を使用して、指定したコンテキストおよびデバイスでプログラム作成プロセスを完了します。