7

我想在一个系统中一起使用 2 个 OpenCL 运行时(在我的情况下是 AMD 和 Nvidia,但问题很笼统)。

我知道我可以使用任何 SDK 编译我的程序。但是在运行程序的时候,我需要提供libOpenCL.so。如何提供两个运行时的库,以便在我的 OpenCL 程序中看到 3 个设备(AMD CPU、AMD GPU、Nvidia GPU)?

我知道它一定是可能的,但我还没有找到关于如何为 linux 做的描述。

非常感谢,托马斯

4

4 回答 4

6

你想的不对。SDK 不是由应用程序提供的,也不需要运行已编译的程序。OpenCL运行时由客户端系统提供,这就是让您的程序平台和设备在clGetPlatformIDsclGetDeviceIDs.

如果用户没有 Nvidia 显卡,您将无法在他的系统上使用 Nvidia 平台和设备,因为他没有 Nvidia OpenCL 运行时或硬件。

所有不同的 OpenCL SDK 都为您提供特定于供应商的扩展,然后供应商运行时即可理解这些扩展。

于 2013-02-12T14:21:58.240 回答
5

Khronos OpenCL 工作组定义了一个 ICD 层(可安装的客户端驱动程序),它允许在系统上安装多个供应商驱动程序。应用程序通过 ICD 层访问供应商驱动程序。有关更多详细信息,请参阅cl_khr_icd.txt

于 2013-02-16T17:48:34.343 回答
4

史密斯和托马斯的答案是正确的;这只是对该信息的扩展:当您枚举 OpenCL 平台时,您会为每个安装的驱动程序获得一个。在每个平台中,您都枚举了设备。AMD 和 Intel 驱动程序也暴露了 CPU 设备。因此,在完全填充的机器上,您可能会看到一个 AMD 平台(带有 CPU 和 GPU 设备)、一个 NVIDIA 平台(带有 GPU 设备)和一个 Intel 平台(带有 CPU 和 GPU 设备)。您的代码会在您想要使用的任何设备上创建一个上下文,并创建一个或多个命令队列来为它们工作。您可以让他们都忙于工作,但您只能在同一平台的设备之间共享数据缓冲区。要跨平台共享数据,它必须在两者之间使用 CPU 内存。

于 2013-02-17T02:41:01.167 回答
2

关于同时在多个 OpenCL 设备上运行。如果您想在多个设备上运行,请为每个设备/供应商创建一个单独的上下文,并在单独的线程中运行每个。例如,我有一个 GTX 590。这显示为两个 GTX 590 设备。我也有英特尔 i7 处理器。我创建了三个上下文:两个用于 590 设备,一个用于 CPU,并使用 SDL_CreateThread 在三个线程中运行每个上下文/设备(pthreads 也很好用)。如果您想获得好的结果,您必须根据每个设备的“速度”来衡量每个设备的作业数量。例如,每个 GTX 590 为 45%,CPU 为 10%。使用的最佳权重取决于应用程序。

于 2013-03-09T19:46:02.523 回答