如何为 OpenCL-2.0 设备列出 OpenCL 平台?

How do OpenCL platforms are listed for OpenCL-2.0 devices?

我需要为我的开源项目实现针对版本 1.2 的真正有效的平台版本过滤器: https://github.com/tugrul512bit/Cekirdekler

我现在没有 150 美元购买支持 OpenCL2.0 的显卡,所以我正在使用纯 1.2 版本系统,不确定其他(新)系统。

问题:当同一系统中只有支持 opencl 2.0 的 gpus 并且同时支持 1.2(max) 和 2.0(max) 的 gpus 时,平台列表看起来如何?

假设我正在使用这个

clGetPlatformIDs()

获取列表。我应该假设它只为每个设备提供单一版本的平台,还是

例如,GTX-Titan XP(支持 opencl 2.0?)可以列出两个平台:

同一设备分开?还是只给出2.0版本?

GTX-TitanXP 和 GT-640 怎么样?

会发生哪一个?

这可以随驱动程序改变吗?

OpenCL 2.3 版 GPU 怎么样?它们在 OpenCL API 中看起来是 2.0 还是正确地给出了 3 作为次要版本?

如果有人可以分享 his/hers 经验,我将不胜感激。


目前,项目可以采用 1.2 或 2.0 版本(我安装的 Intel 驱动程序有一个带有错误的实验版本 2.1,所以我通过次要版本检查过滤掉,我不确定 Nvidia 或 Amd 是否可以做类似的或在支持 OpenCL-2.x 的卡中则相反)。我还可以过滤平台名称 "experimental"/"beta" 以消除此类平台,但我不确定是否有多个版本用于相同的 GPU。


我假设 2.0 设备向后兼容 1.2,但我需要任何额外的东西来启用 1.2 规范吗?现在我没有为 1.2 设备做任何额外的事情。也许 2.0 需要一些?

每个平台return都有自己的独立于其他平台的版本号。您可以混合使用,例如 1.2 的 GPU 和 2.0 的 CPU 驱动程序。

如果您只进行 OpenCL 1.2 API 调用,您可以使用其中任何一个。如果您进行 OpenCL 2.0 API 调用,您只能使用 2.0 或更高版本的平台。

同样,平台内的设备可以 return 自己的版本号,但我认为它们不能大于其父平台号。这方面的一个例子是较旧的 GPU,即使平台是 1.2,它也可能只是 OpenCL 1.1。

与此不同的是每个设备支持的 OpenCL 内核语言版本。为了向后兼容,如果您不通过编译选项,您将获得 OpenCL C 1.x。如果您使用的是 2.x 设备,您可以在编译内核时传递一个选项字符串以获得新的语言特性。