C++ clGetDeviceInfo和clGetPlatformInfo在OpenCL中失败,错误代码为-30(CL值无效)

C++ clGetDeviceInfo和clGetPlatformInfo在OpenCL中失败,错误代码为-30(CL值无效),c++,opencl,gpgpu,opencl.net,C++,Opencl,Gpgpu,Opencl.net,我开始为使用OpenCL编写一个小“引擎”。现在,我遇到了一个非常奇怪的问题 当我调用clGetDeviceInfo()查询特定设备的信息时,参数param_name的一些选项返回错误代码-30(=CL_无效值)。一个非常著名的选项是CL_DEVICE_EXTENSIONS,无论我使用什么sdk或平台,它都应该返回一个扩展字符串。我检查了每条边,并且对参数进行了双重检查 另一件我不明白的事情是,当我在工作时在我的Windows机器上运行我的源代码时,clGetPlatformInfo()函数也会

我开始为使用OpenCL编写一个小“引擎”。现在,我遇到了一个非常奇怪的问题

当我调用
clGetDeviceInfo()
查询特定设备的信息时,参数
param_name
的一些选项返回错误代码-30(=CL_无效值)。一个非常著名的选项是CL_DEVICE_EXTENSIONS,无论我使用什么sdk或平台,它都应该返回一个扩展字符串。我检查了每条边,并且对参数进行了双重检查

另一件我不明白的事情是,当我在工作时在我的Windows机器上运行我的源代码时,
clGetPlatformInfo()
函数也会在查询CL\u平台扩展字符串时返回CL\u INVALID\u值。在家里,我使用的是运行Ubuntu的Linux机器,它显示的扩展字符串没有任何问题


以下是我的平台的数据:

  • 工作:

    • 英特尔酷睿i5 2500处理器
    • 英伟达Geforce 210 GPU
    • AMD应用程序SDK 3.0测试版
  • 主页:

    • 英特尔酷睿i7 5820K处理器
    • AMD Radeon HD7700 GPU
    • AMD应用程序SDK 3.0测试版

以下是资料来源:

源代码是用cpp编写的,opencl函数嵌入到一些包装类(即OCLDevice)中


正如您在代码param_value_size>param_value_size_ret中看到的,因此也没有理由返回错误。参数名称是从要保存的标题复制的,没有键入错误


如果有人知道这个问题的答案,那就太好了。

OpenCL规范规定,
clGetDeviceInfo
可以返回
CL\u无效值,如果(除其他外):

。。。或者,如果param_value_size指定的字节大小<表4.3中指定的返回类型大小

对于
CL\u DEVICE\u EXTENSIONS
查询,您已为128个字符分配了存储空间,并将128作为
param\u value\u size
参数传递。如果设备支持大量扩展,则完全可能需要超过128个字符

通过将
0
NULL
传递给
param_value_size
param_value
参数,可以查询存储查询结果所需的空间量,然后使用该参数分配足够的存储空间:

clGetDeviceInfo(device, CL_DEVICE_EXTENSIONS, 0, NULL, &retSize);

char extensions[retSize];
clGetDeviceInfo(device, CL_DEVICE_EXTENSIONS, retSize, extensions, &retSize);

谢谢你的回答,这解决了我的问题。我现在用malloc的方式做,一切都很好。
clGetDeviceInfo(device, CL_DEVICE_EXTENSIONS, 0, NULL, &retSize);

char extensions[retSize];
clGetDeviceInfo(device, CL_DEVICE_EXTENSIONS, retSize, extensions, &retSize);