2016-02-05 43 views
0

我在Windows上使用OpenCL 2.0。我的机器有2个平台:如何在Windows上禁用已注册的OpenCL平台?

  • CUDA GPU(与OpenCL的1.2)
  • 英特尔CPU/GPU(与OpenCL的2.0)

我不想的OpenCL API返回CUDA平台上所有。根据article,opencl.dll通过查看Windows注册表来返回注册的平台。但是,没有提及要搜索哪些注册表项。

如何在Windows上禁用某个OpenCL驱动程序/平台,以便不会由API返回?

+0

你的目标是什么?一旦OpenCL API返回两个平台,您可以通过查看平台信息(clGetPlatformInfo()提供供应商名称)来删除一个平台。请详细说明,如果这种方法不适合你的目的 – ARK

+0

是的,我可以做到这一点,当然这是我现在做的。但是,我正在将代码作为团队的一部分工作,我不想特别更改此案例的代码,并错误地将此代码提交给其他人(如果我在推送前忘记撤消该更改)。因为我是迄今为止与OpenCL 2.0合作的团队中唯一一个人,所以其他人不希望这样做。 –

+0

如果您的问题是考虑特定于特定opencl版本的设备/平台,那么使用标记为“CL_DEVICE_OPENCL_C_VERSION”的clGetDeviceInfo()来获取opencl版本。在你的情况下,使用opencl2.0版本取得设备并继续。在这种情况下,任何意外登记都不会给您的团队带来任何问题。 – ARK

回答

3

正如您所说,OpenCL ICD加载程序从Windows注册表中获取可用的OpenCL平台列表。要防止OpenCL平台出现在系统上运行的任何OpenCL应用程序中,只需从以下一个或两个注册表项中删除相应的值:

对于64位上的32位机器或64位应用程序位机: HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\OpenCL\Vendors

对于64位计算机上的32位应用程序: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Khronos\OpenCL\Vendors

注册表值的名称将是完整路径.dll提供OpenCL运行实现。

在我看来,这是一个相当严厉的解决问题的方法。大多数OpenCL应用程序为用户提供了手动选择/覆盖所需的OpenCL平台的方法(例如,通过命令行参数,环境变量或甚至GUI(如果适用))。

+0

如果您只想在单个开发机器上隐藏1.2平台,这是一个合理的解决方案。我建议保存注册表子树,以便稍后恢复。正如问题中的注释所示,如果您希望在所有机器上都发生这种情况,请忽略代码中的<2.0平台或设备。 – Dithermaster