我正在尝试将程序缓存在文件中,以便它不需要编译为程序集。因此,我试图转储二进制文件。我遇到了一个问题,即返回的二进制程序最后交替有垃圾数据。
为清楚起见省略了错误检查(但没有发生错误):
clGetProgramInfo(kernel->program, CL_PROGRAM_BINARY_SIZES, 0,NULL, &n);
n /= sizeof(size_t);
size_t* sizes = new size_t[n];
clGetProgramInfo(kernel->program, CL_PROGRAM_BINARY_SIZES, n*sizeof(size_t),sizes, NULL);
我已经确认 kernel->program 在两次之间是相同的。在上面的代码中,“n”始终为 1,但 size[0] 在 2296 和 2312 交替运行之间变化。
问题是 2296 数字似乎更准确 - 在输出中的最后一个右大括号之后,有三个换行符,然后是三个空格。
对于 2312 数字,在输出中最后一个右大括号之后,有三个换行符,一行垃圾数据,然后是三个空格。
自然,垃圾数据这一行是有问题的。我不知道如何摆脱它,我很确定这不是我的错误。
NVIDIA GeForce GTX 580M,在 Windows 7 上使用驱动程序 305.60。
更新:我已将代码更改为以下内容:
//Get how many devices there are
size_t n;
clGetProgramInfo(kernel->program, CL_PROGRAM_NUM_DEVICES, 0,NULL, &n);
//Get the list of binary sizes
size_t* sizes = new size_t[n];
clGetProgramInfo(kernel->program, CL_PROGRAM_BINARY_SIZES, n*sizeof(size_t),sizes, NULL);
//Get the binaries
unsigned char** binaries = new unsigned char*[n];
for (int i=0;i<(int)n;++i) {
binaries[i] = new unsigned char[sizes[i]];
}
clGetProgramInfo(kernel->program, CL_PROGRAM_BINARIES, n*sizeof(unsigned char*),binaries, NULL);
现在,代码有 n = 4,但只有 sizes[0] 包含有意义的信息(因此 sizes[1] 的分配在循环中失败)。想法?