我正在尝试使用clCreateProgramWithBinary使基本程序正常工作。因此,我知道如何使用它,而不是“真正的”应用程序。
我看到参数之一是二进制列表。我将如何精确地创建一个二进制文件进行测试?我有一些测试代码,这些代码可以从源代码创建程序,并对其进行排队和入队。在此过程中的某个时刻是否创建了二进制文件,可以将其输入clCreateProgramWithBinary?
这是我的一些代码,只是为了让我了解整体流程。为了简单起见,我省略了注释和错误检查。
program = clCreateProgramWithSource(clctx, 1, &dumbkernelsource, NULL, &errcode);
errcode = clBuildProgram(program, env->num_devices, env->device, NULL, NULL, NULL);
mykernel = clCreateKernel(program, "flops", &errcode);
errcode = clGetKernelWorkGroupInfo(mykernel, *(env->device), CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, NULL);
global = num_workgroups * local;
errcode = clEnqueueNDRangeKernel(commands, mykernel, 1, NULL, &global, &local, 0, NULL, NULL);
最佳答案
编译程序后,可以使用clGetProgramInfo获得其二进制代码,然后将其保存到文件中。
示例代码(未尝试编译,但应遵循以下原则):
program = clCreateProgramWithSource(clctx, 1, &dumbkernelsource, NULL, &errcode);
errcode = clBuildProgram(program, env->num_devices, env->device, NULL, NULL, NULL);
int number_of_binaries;
char **binary;
int *binary_sizes;
errcode = clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, NULL, 0, &number_of_binaries);
binary_sizes = new int[number_of_binaries];
binary = new char*[number_of_binaries];
errcode = clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, binary_sizes, number_of_binaries*sizeof(int), &number_of_binaries);
for (int i = 0; i < number_of_binaries; ++i) binary[i] = new char[binary_sizes[i]];
errcode = clGetProgramInfo(program, CL_PROGRAM_BINARIES, binary, number_of_binaries*sizeof(char*), &number_of_binaries);