我正在尝试将程序缓存在一个文件中,这样就不需要编译成程序集。因此,我试图转储二进制文件。我遇到的问题是,交替返回的二进制程序最后会有垃圾数据。
为清晰起见,省略了错误检查(不会发生错误):
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->程序在两次之间是相同的。在上面的代码中,“n”总是1,但是大小[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]包含有意义的信息(因此在循环中,size [1]的alloc失败)。想法?
答案 0 :(得分:1)
我获得了包含以下行的设备数量:
clGetProgramInfo(kernel-&gt; program,CL_PROGRAM_NUM_DEVICES,sizeof(cl_uint),&amp; n,NULL);
答案 1 :(得分:0)
不确定为什么第二个示例对于每次运行都不同...您确定每次都在为同一设备构建吗?
答案 2 :(得分:0)
clGetProgramInfo(kernel->program, CL_PROGRAM_NUM_DEVICES, 0,NULL, &n);
需要:
clGetProgramInfo(kernel->program, CL_PROGRAM_NUM_DEVICES, sizeof(size_t), &n, NULL);