【发布时间】:2011-07-14 16:44:55
【问题描述】:
我有一个 OpenCL Windows 程序,它可以进行大量的数字运算并愉快地消耗 100% 的 GPU。我希望能够在正常使用计算机时在后台运行它,但现在它会导致相当大的桌面延迟并使任何 3d 应用程序无法使用。
有没有办法在 OpenCL 中设置优先级,以便它将 GPU 功率提供给其他进程并且只使用空闲周期?
【问题讨论】:
我有一个 OpenCL Windows 程序,它可以进行大量的数字运算并愉快地消耗 100% 的 GPU。我希望能够在正常使用计算机时在后台运行它,但现在它会导致相当大的桌面延迟并使任何 3d 应用程序无法使用。
有没有办法在 OpenCL 中设置优先级,以便它将 GPU 功率提供给其他进程并且只使用空闲周期?
【问题讨论】:
不幸的是,大多数 GPU 不支持一次运行多个任务,因此无法分配优先级。这意味着当您的 OpenCL 内核运行时,它是唯一由 GPU 执行的任务,并且在内核完成之前都是如此。
如果您希望计算机在运行内核(正常的桌面活动、浏览、视频、游戏)时可用,则每次内核迭代都必须非常快。因此,如果您可以减少每组内核启动所花费的时间(即使用 clEnqueueNDRangeKernel 排队的每个作业),您可能会得到您想要的。这可以通过使 NDRange 更小来实现,尽管它需要足够大才能在 GPU 上高效。我发现在 Radeon HD 5870 上最少需要 5120 个工作项。或者您可以减少每个内核中的工作量。
如果您可以将每个排队作业的执行时间降低到大约 1/60 秒,那么计算机很有可能可用。我已经能够运行 OpenCL 程序,其中每个入队大约需要 1/120 秒,而游戏时却没有注意到任何事情。
【讨论】: