【问题标题】:Best Practices of using GPU with OpenCL将 GPU 与 OpenCL 结合使用的最佳实践
【发布时间】:2013-08-20 17:10:48
【问题描述】:

我已经开始使用 OpenCL 使用 GPU 进行开发。 我一直在玩那些突破极限的代码。

在此期间,我遇到了这样一种情况,即 GPU 上的计算时间相对较长,这会导致 GUI 变得无响应和/或 GPU 任务需要很长时间以致设备驱动程序被重置。

虽然我理解为什么会发生这种情况并且我不是在寻找和解释原因, 我希望了解的是,我可以使用系统用于 GUI 操作的 GPU 将计算推到多远。

是否有此类交互的任何指南/最佳实践

是否有任何编程方法可以允许长时间运行 GPU 计算并仍然允许 GUI 保持响应。

我知道基本的建议是将 GPU 任务拆分为相对较小的我假设这是不可能的,因为我正在探索 GPU 编程的限制。

任何在线讨论都会非常有用。

吉姆·K

【问题讨论】:

  • 您可能对异步编程感兴趣,这是在后台执行某些任务时保持应用程序响应的常用“解决方案”。这取决于您使用的语言,在 C++ 中有 boost 或最新的 C++11 标准,并且都提供对异步任务/方法的支持。
  • 对不起,如果我没有说清楚。是窗口本身变得无响应而不是我的 GUI。其实我用的是命令行

标签: opencl gpu


【解决方案1】:

要回答您的问题,没有什么可以实现您的目标,即拥有一个长时间运行的内核并在一个 GPU 上维护一个正常工作的 GUI。如果您想要长时间运行的内核和正常运行的 GUI,则必须使用专用 GPU 进行计算。如果您希望在同一 GPU 上进行计算时获得响应式 GUI,则必须使用运行时间较短的内核。你可以每周在 AMD 或 Nvidia 论坛上抱怨,请求此功能。

唯一想到的独立于平台的划分工作的方法是限制发送到 GPU 的工作量,使其在 1/60 秒内完成(对于 60Hz 屏幕)并包含睡眠命令这会使 CPU 线程暂时休眠,以便其他应用程序可以将任务发送到 GPU。您可能需要调整该时间限制以找到不影响用户的内容。

【讨论】:

  • 这是我所期望的。只是想让有更多 OpenCL 知识的人确认这一点。
【解决方案2】:

一种解决方案是使用两个显示设备:一个用于操作系统,另一个用于计算。但从长远来看,打破有好处。例如,假设一个 GPU 任务需要 10 天。您如何知道 GPU 任务在这 10 天期间真正运行正常?将任务分成几秒钟的片段允许您向控制程序添加进度报告功能。分解任务还允许控制程序实现周期性状态保存功能,以便在电源故障后恢复。如果您想使用多个 GPU 来进一步加速计算,那么必须将任务分成更小的部分。当每个 GPU 完成前一部分时,可以将一小部分工作分配给它。这样,所有 GPU 将保持完全加载,直到任务完成。相反,如果将任务划分为每个 GPU 的大部分,那么很难或不可能确定各个部分的大小以使所有 GPU 同时完成。

我相信大多数 GPU 工作负载都可以分解为几秒钟的片段,而不会造成任何显着的性能损失。所以从这个意义上说,分解任务并没有减损 GPU 计算“突破极限”的目标。如果控制程序连续向操作系统显示器使用的GPU分配工作,它仍然可能影响操作系统显示器的响应能力。在不降低性能的情况下解决此问题的方法是使用远程桌面、VNC 或类似工具远程访问机器。

【讨论】:

  • 从编程的一般原则我知道这一切都是正确的。但是,由于我正在探索极限,我仍然处于这种状态。 (这样做的原因是这些技术的预期未来使用)。我目前拥有的(再次我正在探索限制)是一个 1M 的工作项和 4 个工作组。总时间大约需要 5 秒(可调整)。在执行它时,系统 GUI 不起作用。这又是人为的,因为我正在探索极限。
  • 我同意 ScottD 的观点。如果你的问题需要 5 秒钟,你需要把它分开。 GPU 任务应在不到一秒的时间内运行,否则您的系统将变得非常迟钝。运行 100 个 50 毫秒内核的效率不会低于 1 个 5000 毫秒内核。
猜你喜欢
  • 2010-11-28
  • 2018-06-22
  • 2010-10-29
  • 2010-09-06
  • 1970-01-01
  • 2013-08-11
  • 2014-12-13
  • 2014-01-14
  • 1970-01-01
相关资源
最近更新 更多