AFAIK 它的工作原理如下 with ICD 加载器扩展:
由于 ICD 加载器只是一个可选的 OpenCL 扩展,我想知道在没有 ICD 加载器的情况下 OpenCL 如何工作。当然,在这种情况下,您不能在同一个应用程序中同时使用多个供应商的实现,但是使用什么来链接应用程序呢?如果开发人员将其与特定实现联系起来,那么 OpenCL 的主要目标(可移植性)就无法再实现。
或者供应商是否必须提供彼此兼容的动态库?这意味着,如果开发人员链接到供应商 A 的动态库,那么在运行时它也可以工作,如果目标系统安装了供应商 B 的动态库?
有记录在案吗?
对于 Windows OpenCL 应用程序,您的应用程序包含 OpenCL.h(或 cl.h)和 OpenCL.lib 的链接,OpenCL.lib 是驻留在 Windows System32 文件夹中的 OpenCL.dll 的静态库包装器。您不知道它是 ICD 还是供应商驱动程序。在过去的许多年里,它一直是一个 ICD,但在此之前(对于非常早期的 OpenCL 实现)它是一个供应商驱动程序。 ICD 的美妙之处在于应用程序不需要知道,您只需调用 OpenCL API 即可。只有当它是ICD时,平台数量才会大于1。
程序不是针对供应商 OpenCL 实现构建的。它是针对 OpenCL 本身构建的,供应商 OpenCL 是最终用户 GPU 的 OpenCL 实现。
因此,具体实现是针对最终用户的,多个实现仅需要在多 GPU 设置中使用,或者如果您更喜欢特定实现。这与最终用户的偏好有关。