Opencl clGetProgramInfo CL_程序\u二进制\u大小不正确的结果?

Opencl clGetProgramInfo CL_程序\u二进制\u大小不正确的结果?,opencl,Opencl,我试图在文件中缓存一个程序,这样它就不需要编译成程序集。因此,我试图转储二进制文件。我遇到了一个问题,即交替返回的二进制程序的末尾有垃圾数据 为清晰起见,省略了错误检查(但未发生错误): 我已经确认了内核->程序在不同时间是相同的。在上述代码中,“n”始终为1,但大小[0]在2296和2312次交替运行之间变化 问题是2296的数字似乎更准确——在输出中的最后一个右大括号之后,有三个换行符和三个空格 对于2312号,在输出中的最后一个大括号之后,有三个换行符、一行垃圾数据,然后是三个空格 当然,

我试图在文件中缓存一个程序,这样它就不需要编译成程序集。因此,我试图转储二进制文件。我遇到了一个问题,即交替返回的二进制程序的末尾有垃圾数据

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

我已经确认了内核->程序在不同时间是相同的。在上述代码中,“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);
//获取有多少个设备
尺寸;
clGetProgramInfo(内核->程序,CL\u程序\u数量\u设备,0,NULL,&n);
//获取二进制大小的列表
尺寸*sizes=新尺寸[n];
clGetProgramInfo(内核->程序,CLU程序二进制大小,n*sizeof(大小),大小,空);
//获取二进制文件
无符号字符**二进制文件=新的无符号字符*[n];
对于(inti=0;iprogram,CL_程序_二进制文件,n*sizeof(unsigned char*)),二进制文件,NULL);

现在,代码有n=4,但只有大小[0]包含有意义的信息(因此大小[1]的alloc在循环中失败)。想法?

具有CL_程序二进制大小和CL_程序二进制文件的clGetProgramInfo需要一个指向数组的指针,而不仅仅是指向单个变量的指针,因为它为构建程序时提供的每个设备创建二进制文件。这就是为什么第一行不返回任何内容。对于第二个示例,n应该是设备的数量


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

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

clGetProgramInfo(内核->程序,CL\u程序\u数量\u设备,sizeof(CL\u uint),&n,NULL)

需要:

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

第一行用于返回数组的大小。我不可能传递数组,因为我不知道数组的大小。一旦将大小(1)存储到n中,就可以分配数组并再次调用该行。我很确定它是同一个设备——至少我自己没有改变它。我的观点是n应该是上下文中设备的数量。如果你想得到与程序相关联的设备数量,你必须在第一行使用CL_program_NUM_设备,而不是CL_program_BINARY_大小。请看,我似乎在我的原始代码中漏掉了“n/=sizeof(size_t);”行(我想是这样的),所以我认为我的代码所做的事情是一样的。我已经做了建议的修改。请参阅更新。您只有一个GPU连接到系统,对吗?所以n不应该是4,应该是1。CL_PROGRAM_NUM_设备的返回类型为CL_uint,而不是size_t。尝试将n的类型改为cl_uint,也许可以。应该只有一个GPU:它是一个笔记本电脑,与之前的NVIDIA GeForce GTX 580M一样。该函数对于cl_uint不存在,但将n更改为cl_uint并将其地址强制转换为size_t*,这样它仍然可以返回n==4。I。不知道我为什么会那样。但这解决了问题。denis2342先得到,但你解释得更好+我对他说,替你接受。
clGetProgramInfo(kernel->program, CL_PROGRAM_NUM_DEVICES, 0,NULL, &n);
clGetProgramInfo(kernel->program, CL_PROGRAM_NUM_DEVICES, sizeof(size_t), &n, NULL);