2011-04-13 125 views
6

我想用OpenCL多个设备在GPU和CPU上运行并行任务。 AMD SDK的标准示例在这个主题上并不十分清晰。你能建议关于这个主题的其他教程或例子吗?任何建议都可以。OpenCL:运行CPU/GPU多个设备

谢谢。

+0

我的论文[CPU-GPU异构计算技术综述](https://goo.gl/hBK9nw)讨论了使用CPU和GPU进行计算的许多运行时系统和编程语言。 – user984260 2015-07-17 17:52:04

回答

1

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

1

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

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

+0

不幸的是,在这种情况下你不会找到gpu和cpu。要在Nvidia硬件上运行OpenCL,您需要Nvidia的运行时库。它只会看到Nvidia设备。如果你有AMD gpu,你可以一次看到cpu和gpu,因为它们共享一个运行库。 AMD创造了更多真正的异构平台。 – MiKom 2012-08-19 14:20:46

+0

您可以使用例如AMD OpenCL,并注册NVida的实施。我做了一次,据我所知,它工作。您必须在Linux的/ etc/OpenCL/vendors中输入供应商。对于Windows,我不知道位置,但应该有类似的东西。 – 2012-08-27 16:29:23

+0

事情从上次改变了一下。 Khronos引入了Installable Client Driver,即Shim OpenCL库,用于查找实际的实现并展示其API。 (http://www.khronos.org/registry/cl/sdk/2.0/docs/man/xhtml/cl_khr_icd.html)。 – MiKom 2013-08-22 20:01:51

5

运行并行任务4.12节需要良好的效益分析动态调度,因为你永远不知道任何设备的准确性能 - 它取决于当前的负载(不仅仅是你的程序,而是所有其他的),当前时钟(根据当前的节能模式或负载,它可能会在大多数CPU和GPU上显着变化)。另外,真实世界的性能可能取决于您的输入数据。

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

StarPU

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

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

SkePU

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

如果你是谷歌的“动态调度gpu cpu opencl”,你可以找到更有用的免费或商业项目和文档。

0

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