0

我正在尝试将程序缓存在文件中,以便它不需要编译为程序集。因此,我试图转储二进制文件。我遇到了一个问题,即返回的二进制程序最后交替有垃圾数据。

为清楚起见省略了错误检查(但没有发生错误):

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] 的分配在循环中失败)。想法?

4

3 回答 3

1

我通过以下行获得设备数量:

clGetProgramInfo(kernel->program, CL_PROGRAM_NUM_DEVICES, sizeof(cl_uint), &n, NULL);

于 2013-03-21T15:39:37.537 回答
0

带有 CL_PROGRAM_BINARY_SIZES 和 CL_PROGRAM_BINARIES 的 clGetProgramInfo 需要一个指向数组的指针,而不仅仅是指向单个变量,因为它会为您在构建程序时提供的每个设备创建二进制文件。这就是为什么第一行什么都不返回的原因。第二个例子的 n 应该是设备的数量。

不确定为什么每次运行的第二个示例都不同...您确定每次都在为同一设备构建吗?

于 2012-10-13T10:18:53.347 回答
0
clGetProgramInfo(kernel->program, CL_PROGRAM_NUM_DEVICES, 0,NULL, &n);

需要是:

clGetProgramInfo(kernel->program, CL_PROGRAM_NUM_DEVICES, sizeof(size_t), &n, NULL);
于 2013-09-26T09:35:21.520 回答