我一直在使用OpenCL开始使用GPU进行开发。 我一直在玩代码推动限制。
在此过程中,我遇到了GPU上的计算时间相对较长的情况,导致GUI无响应和/或GPU任务需要很长时间才能重置设备驱动程序。
虽然我理解为什么会发生这种情况,但我并不是在寻找和解释原因, 我希望了解的是,我可以在多大程度上推动系统用于GUI操作的GPU进行计算。
是否存在此类互动的指南/最佳做法
是否有任何编程方法可以允许长时间运行的GPU计算,并且仍然允许GUI保持响应。
我知道基本的建议是将GPU任务拆分为相对较小我假设这是不可能的,因为我正在探索GPU编程的限制。
任何在线讨论都非常有用。
Jim K
答案 0 :(得分:1)
要回答您的问题,您无法做任何事情来实现您拥有一个长时间运行的内核并在一个GPU上维护一个正常运行的GUI的目标。如果您需要长时间运行的内核和功能正常的GUI,则必须使用专用的GPU进行计算。如果您想在同一GPU上进行计算时需要响应式GUI,则必须具有运行时较短的内核。你可以每周在AMD或Nvidia论坛上抱怨这个功能。
唯一独立于平台的工作分配方法是限制发送到GPU的工作量,使其完成1/60秒(对于60Hz屏幕)并包含睡眠命令使CPU线程暂时休眠,以便其他应用程序可以将任务发送到GPU。您可能需要调整该时间限制才能找到不会影响用户的内容。
答案 1 :(得分:0)
一种解决方案是使用两个显示设备:一个用于OS,另一个用于计算。但是从长远来看有好处。例如,假设GPU任务需要10天。你怎么知道GPU任务在那10天期间是否真的正常运行?将任务分解为几秒的分段允许您向控制程序添加进度报告功能。分解任务还允许控制程序实现周期性状态保存功能,以便在电源故障后恢复。如果要使用多个GPU来进一步加速计算,则必须将任务分解为更小的段。当完成前一个分段时,可以为每个GPU提供一小部分工作。这样,在任务完成之前,所有GPU都将保持完全加载状态。相反,如果每个GPU的任务被分成很大的部分,那么很难或不可能调整各个部分的大小,以便GPU同时完成。
我相信大多数GPU工作负载都可以分成几秒钟,而不会造成任何重大的性能损失。所以在这个意义上,分解任务并没有减损“推动GPU计算的极限”的目标。如果控制程序向OS显示器使用的GPU连续调度工作,则仍可能影响OS显示的响应性。解决此问题但不会降低性能的方法是使用远程桌面,VNC或类似设备远程访问计算机。