OpenCL:运行CPU / GPU多个设备

时间:2011-04-13 10:38:11

标签: opencl

我想用OpenCL多个设备在GPU和CPU上运行并行任务。 AMD SDK的标准示例在此主题上并不十分清楚。您能否就此主题提供任何其他教程或示例建议?任何建议都可以。

谢谢。

5 个答案:

答案 0 :(得分:5)

在多个设备上运行并行任务需要动态调度以获得良好的效率,因为您永远不会知道任何设备的确切性能 - 它取决于当前负载(不仅是您的程序,还有所有其他设备),当前时钟(它可能会显着改变)大多数CPU和GPU取决于当前的节能配置文件或负载)。此外,实际性能可能取决于您的输入数据。

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

StarPU

  

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

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

SkePU

  

SkePU是多核CPU和多GPU系统的骨架编程框架。它是一个C ++模板库,具有六个数据并行和一个任务并行骨架,两种容器类型,并支持在具有CUDA和OpenCL的多GPU系统上执行。最近,通过为StarPU运行时系统实现后端,在SkePU中开发了对混合执行,性能感知动态调度和负载平衡的支持。

如果您使用Google进行“动态调度gpu cpu opencl”,您可以找到更有用的免费或商业项目和文档。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

使用clGetPlatforms,您将了解您是否拥有多个平台。如果您运行nVidia GPU板和AMD CPU,您将找到平台。一个用于AMD SDK的平台和一个用于nVidia CUDA OpenCL实现的平台。使用clGetDevices,您可以在每个平台上找到可用的设备。它可能是每个平台一个,如1xGPU和1xCPU。

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

答案 3 :(得分:1)

有关使用多个设备的教程和详细信息,您可能需要参考AMD-APP-SDK Programming guide

的第4.12节

答案 4 :(得分:0)

Aftab Munshi的OpenCL编程指南&其他人会给你更多细节。