OpenCL:运行CPU/GPU多设备

6
我希望能够在使用OpenCL多个设备时,在GPU和CPU上运行并行任务。 AMD SDK的标准示例在这方面不是很清楚。你能否提供任何其他关于这方面的教程或示例?任何建议都可以。
谢谢。

我的论文《CPU-GPU异构计算技术综述》(https://goo.gl/hBK9nw)讨论了许多运行时系统和编程语言,用于利用CPU和GPU进行计算。 - user984260
5个回答

5
在多个设备上运行并行任务需要动态调度以获得良好的效率,因为您无法精确了解任何设备的性能 - 它取决于当前负载(不仅仅是您的程序,还有所有其他程序),当前时钟(它可能会根据当前节能配置或负载在大多数 CPU 和 GPU 上显着变化)。此外,实际性能可能取决于您的输入数据。
当然,您可以像所有其他答案建议的那样编写所有必要的代码,但我认为这是浪费时间的做法,使用现有的解决方案更好。我建议使用 StarPU。我在我的 OpenCL 项目中使用了 StarPU,它表现得非常好。StarPU带有示例,说明如何编写能够有效使用多个GPU和CPU的代码。 StarPU:
传统处理器已经达到了架构上的限制,异构多核设计和硬件专业化(例如协处理器、加速器等)旨在解决这个问题。然而,利用这样的机器会引入许多具有挑战性的问题,涉及编程模型和编译器到可扩展硬件解决方案的设计。为这些体系结构设计高效的运行时系统是一个关键问题。StarPU通常使高性能库或编译器环境更容易利用异构多核机器,可能配备GPGPUs或Cell处理器:程序员可以集中精力于算法问题,而不是处理低级问题。
还有另一个项目SkePU,但我自己没有尝试过: SkePU
SkePU是一个面向多核CPU和多GPU系统的骨架编程框架。它是一个C++模板库,具有六个数据并行和一个任务并行的骨架,两种容器类型,并支持在CUDA和OpenCL上执行多GPU系统。最近,通过实现StarPU运行时系统的后端,SkePU开发了对混合执行、性能感知动态调度和负载平衡的支持。
如果你在谷歌上搜索“动态调度gpu cpu opencl”,你可以找到更多可能有用的免费或商业项目和文档。

1

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


1

使用clGetPlatforms函数,您可以了解是否有多个平台。如果您运行的是nVidia GPU板和AMD CPU,则会发现两个平台。一个平台用于AMD SDK,另一个用于nVidia CUDA OpenCL实现。使用clGetDevices函数,您可以找到每个平台上可用的设备。可能每个平台只有一个设备,例如1xGPU和1xCPU。

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


很遗憾,在这种情况下你找不到GPU和CPU。要在Nvidia硬件上运行OpenCL,你需要Nvidia的运行时库。它只能看到Nvidia设备。如果你有AMD GPU,你可以同时看到CPU和GPU,因为它们共享一个运行时库。AMD创建了更真正的异构平台。 - MiKom
你可以例如使用 AMD OpenCL,并且将实现注册为 NVida。据我所知,我曾经这样做过,它是有效的。你必须在Linux的/etc/OpenCL/vendors中输入供应商。至于Windows,我不知道位置,但应该有类似的东西。 - Rick-Rainer Ludwig
上次的情况有些变化。Khronos引入了可安装客户端驱动程序,即shim OpenCL库,它寻找实际的实现并公开其API(http://www.khronos.org/registry/cl/sdk/2.0/docs/man/xhtml/cl_khr_icd.html)。 - MiKom

1

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接