OpenCL:运行CPU/GPU多个设备

OpenCL:运行CPU/GPU多个设备,opencl,Opencl,我想在GPU和CPU上使用OpenCL多个设备运行并行任务。AMDSDK中的标准示例对此主题不是很清楚。你能提供关于这个主题的其他教程或例子吗?任何建议都行 谢谢。没有什么能阻止你这么做。您需要为调用clCreateContext()提供所有要使用的设备,然后为每个设备至少创建一个命令队列。根据您尝试执行的操作,您可能需要了解更高级的任务调度技术,例如,使用无序命令队列和事件跨设备调度任务。使用CLGetPlatform,您将了解是否有多个平台。如果你运行一个nVidia GPU板和一个AMD

我想在GPU和CPU上使用OpenCL多个设备运行并行任务。AMDSDK中的标准示例对此主题不是很清楚。你能提供关于这个主题的其他教程或例子吗?任何建议都行


谢谢。

没有什么能阻止你这么做。您需要为调用
clCreateContext()
提供所有要使用的设备,然后为每个设备至少创建一个命令队列。根据您尝试执行的操作,您可能需要了解更高级的任务调度技术,例如,使用无序命令队列和事件跨设备调度任务。

使用CLGetPlatform,您将了解是否有多个平台。如果你运行一个nVidia GPU板和一个AMD CPU,你会发现很多平台。AMD SDK的一个平台和英伟达CUDA OpenCL实现的一个平台。使用clGetDevices,您将发现每个平台都有可用的设备。它可能是每个平台一个,比如1xGPU和1xCPU


对于每个设备,使用clCreateContext创建一个上下文,然后您可以并行运行两者。

有关使用多个设备的教程和详细信息,您可能需要参考《在多个设备上运行并行任务》的第4.12节,因为您永远不知道任何设备的确切性能,这取决于当前负载(不仅由您的程序,还包括所有其他设备)、当前时钟(在大多数CPU和GPU上可能会发生显著变化,具体取决于当前的节能模式或负载)。此外,实际性能可能取决于您的输入数据

当然,您可以像所有其他答案所建议的那样自己编写所有必要的代码,但在我看来,这是浪费时间,最好使用现有的解决方案。我建议使用StarPU。我在我的OpenCL项目中使用了StarPU,效果非常好。StarPU提供了一些示例,说明如何编写能够使用多个GPU的代码和CPU的效率

:

传统处理器已经达到了架构限制,异构多核设计和硬件专业化(如协处理器、加速器等)打算解决。但是,利用这些机器会在各个层面带来许多挑战性问题,从编程模型和编译器到可扩展硬件解决方案的设计。为这些架构设计高效的运行时系统是一个关键问题。StarPU通常会使高性能libra更容易实现ries或编译器环境,以利用可能配备GPGPU或Cell处理器的异构多核机器:程序员可能专注于算法问题,而不是处理低级问题

还有另一个项目,SkePU,但我自己没有尝试过:

:

SigPU是多核CPU和多GPU系统的骨架编程框架,它是一个具有六个数据并行和一个任务并行骨架、两个容器类型的C++模板库,支持在CUDA和OpenCL上的多GPU系统上执行。通过为StarPU运行时系统实现后端,在SkePU中开发负载平衡


如果你搜索“动态调度gpu cpu opencl”您可以找到更多可能有用的免费或商业项目和文档。

Aftab Munshi和其他人提供的OpenCL编程指南将为您提供更多详细信息。

不幸的是,在这种情况下,您将找不到gpu和cpu。要在Nvidia硬件上运行OpenCL,您需要Nvidia的运行库。它只会看到Nvidia设备。如果您有AMD gpu,你可以同时看到cpu和gpu,因为它们共享一个运行库。AMD创建了更多真正的异构平台。你可以使用AMD OpenCL,也可以为NVida注册实现。我做过一次,据我所知,它起了作用。你必须在/etc/OpenCL/vendors for Linux中输入供应商。对于Windows,我是这样做的不知道位置,但应该有类似的东西。与上次相比,情况有所改变。Khronos引入了可安装的客户端驱动程序,即shim OpenCL库,用于查找实际实现并公开其API。(。我的论文讨论了许多使用CPU和GPU进行计算的运行时系统和编程语言。