如何使用2个OpenCL运行时

时间:2013-02-12 14:06:46

标签: opencl

我想在一个系统中同时使用2个OpenCL运行时(在我的情况下是AMD和Nvidia,但这个问题非常通用)。

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

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

非常感谢, 托马斯

4 个答案:

答案 0 :(得分:6)

你没有想到它。 SDK不是由应用程序提供的,并且不需要来运行已编译的程序。 OpenCL 运行时由客户端系统提供,这正是您的程序平台和设备可以在clGetPlatformIDsclGetDeviceIDs中使用的。

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

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

答案 3 :(得分:2)

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