如何将opecl
编译好的程序保存在本地
直接上代码:
void save_program_binary(cl_program program, cl_device_id device, const char *filename) {
cl_uint num_devices = 0;
cl_int err_num;
// 1, Query for number of devices attached to program
err_num = clGetProgramInfo(program, CL_PROGRAM_NUM_DEVICES,
sizeof(cl_uint), &num_devices, NULL);
if (err_num != CL_SUCCESS) {
printf("Error querying for number of devices.\n");
return;
}
printf("num_devices: %d\n", num_devices);
// 2, Get all of the Device IDs
cl_device_id *devices = new cl_device_id[num_devices];
err_num = clGetProgramInfo(program, CL_PROGRAM_DEVICES,
sizeof(cl_device_id) * num_devices, devices, NULL);
if (err_num != CL_SUCCESS) {
printf("Error querying for devices.\n");
delete[] devices;
return;
}
// 3, Determine the size of each program binary
size_t *program_binary_sizes = new size_t[num_devices];
err_num = clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES,
sizeof(size_t) * num_devices, program_binary_sizes, NULL);
if (err_num != CL_SUCCESS) {
printf("Error querying for program binary sizes.\n");
delete[] devices;
delete[] program_binary_sizes;
return;
}
unsigned char **program_binaries = new unsigned char*[num_devices];
for (cl_uint i = 0; i < num_devices; ++i) {
program_binaries[i] = new unsigned char[program_binary_sizes[i]];
}
// 4, Get all of the program binaries
err_num = clGetProgramInfo(program, CL_PROGRAM_BINARIES,
sizeof(unsigned char *) * num_devices, program_binaries, NULL);
if (err_num != CL_SUCCESS) {
printf("Error querying for program binaries.\n");
delete[] devices;
delete[] program_binary_sizes;
for (cl_uint i = 0; i < num_devices; ++i) {
delete[] program_binaries[i];
}
delete[] program_binaries;
return;
}
// 5, Finally store the binaries for the device requested out to disk for future reading
for (cl_uint i = 0; i < num_devices; ++i) {
// Store the binary just for the device requested.
// In a scenario where multiple devices were being used
// you would save all of the binaries out here.
if (devices[i] == device) {
FILE *fp = fopen(filename, "wb");
fwrite(program_binaries[i], 1, program_binary_sizes[i], fp);
fclose(fp);
break;
}
}
// Cleanup
delete[] devices;
delete[] program_binary_sizes;
for (cl_uint i = 0; i < num_devices; ++i) {
delete[] program_binaries[i];
}
delete[] program_binaries;
return;
}