clGetProgramInfo CL_PROGRAM_BINARY_SIZES结果不正确?

时间:2012-10-13 00:37:07

标签: opencl

我正在尝试将程序缓存在一个文件中,这样就不需要编译成程序集。因此,我试图转储二进制文件。我遇到的问题是,交替返回的二进制程序最后会有垃圾数据。

为清晰起见,省略了错误检查(不会发生错误):

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失败)。想法?

3 个答案:

答案 0 :(得分:1)

我获得了包含以下行的设备数量:

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

需要:

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