【问题标题】:OpenCL computation freezes the screenOpenCL 计算冻结屏幕
【发布时间】:2013-04-25 19:50:58
【问题描述】:

正如标题所说,当我运行 OpenCL 内核时,整个屏幕停止重绘(显示器上显示的图像保持不变,直到我的程序完成计算。即使我从笔记本上拔下它也是如此并将其插回 - 始终显示相同的图像)并且计算机似乎也没有对鼠标移动做出反应 - 光标停留在相同的位置。

我不知道为什么会这样。这可能是我的程序中的错误,还是这是标准行为?

在 Google 上搜索时,我在 AMD 的论坛上找到了 this 线程,那里的一些人建议这是正常的,因为 GPU 在忙于计算时无法刷新屏幕。

如果这是真的,还有什么办法可以解决这个问题吗?

我的内核计算可能需要几分钟时间,而让我的计算机在这段时间内几乎无法使用真的很痛苦。

EDIT1:这是我当前的设置:

  • 显卡是 ATI Mobility Radeon HD 5650,具有 512 MB 内存和来自 AMD 网站的最新 Catalyst beta 驱动程序
  • 图形是可切换的 - Intel 集成/ATI 专用卡,但是 我已禁用 BIOS 中的切换,否则我无法获得 在 Ubuntu 上运行的驱动程序。
  • 操作系统是 Ubuntu 12.10(64 位),但在 Windows 7(64 位)上也会出现这种情况。
  • 我的显示器通过 HDMI 插入(但笔记本屏幕冻结 也是,所以这应该不是问题)

EDIT2:所以在玩了一天我的代码之后,我从你的回复中得到了建议,并将我的算法更改为这样的东西(在伪代码中):

for (cl_ulong chunk = 0; chunk < num_chunks; chunk += chunk_size)
{
  /* set kernel arguments that are different for each chunk */
  clSetKernelArg(/* ... */);

  /* schedule kernel for next execution */
  clEnqueueNDRangeKernel(cmd_queue, kernel, 1, NULL, &global_work_size, NULL, 0, NULL, NULL);

  /* read out the results from kernel and append them to output array on host */
  clEnqueueReadBuffer(cmd_queue, of_buf, CL_TRUE, 0, chunk_size, output + chunk, 0, NULL, NULL);
}

所以现在我在主机上拆分整个工作负载并将其分块发送到 GPU。对于每个数据块,我将一个新内核排入队列,并将从中获得的结果附加到输出数组中的正确偏移处。

这就是你的意思是计算应该被划分吗?

这似乎是解决冻结问题的方法,甚至现在我能够处理比可用 GPU 内存大得多的数据,但我还必须进行一些良好的性能测量,看看什么是好的块大小...

【问题讨论】:

  • 不确定您的意思是什么配置,但我用当前硬件设置的信息更新了我的问题。
  • 是的,您对分配工作量有正确的想法。
  • 好的,谢谢你的确认,我想我会接受你的回答并关闭这个话题,因为这基本上解决了我目前的问题。我可能还会进行额外的调试并尝试找出是否有其他原因导致停顿,但我认为我不会很快有任何结果......

标签: opencl freeze


【解决方案1】:

只要 GPU 运行 OpenCL 内核,它就完全专用于 OpenCL。一些现代 Nvidia GPU 是个例外,我认为从 GeForce GTX 500 系列开始,如果这些内核不使用所有可用的计算单元,它们可以运行多个内核。

您的解决方案是将您的计算分成多个短内核调用,这是最好的全面解决方案,因为它甚至可以在单 GPU 机器上工作,或者投资购买便宜的 GPU 来驱动您的显示器。

如果您要在 GPU 上运行长内核,那么您必须禁用 GPU 的超时检测和恢复,或者使超时延迟长于最大内核运行时间(更好,因为仍然可以捕获错误),请参阅 here如何做到这一点。

【讨论】:

  • 感谢您的回答和链接。我也看过它和我的寄存器,但我唯一的条目是TdrDelay,它设置为 60,这很有趣,因为 MSDN 链接指出默认值为 2 秒,而我没有记得改变其中任何一个。此外,尽管我的内核可以运行 2-4 分钟(取决于输入),但我从未经历过我的应用程序过早结束(如果系统在 GPU 上杀死我的内核,我认为它会以这种方式结束)。此外,尽管运行了那么长时间,结果仍然是正确的......
【解决方案2】:

每次我遇到显示冻结或“显示驱动程序停止响应并已恢复”时,都是由于错误。它可以冻结整个系统,我唯一能做的就是重置。相反,现在我先在 CPU 上开发。这永远不会使我的整个系统崩溃。这种方式也更容易调试,因为我可以使用 printf。一旦我的代码在 CPU 上运行没有错误,我就会在 GPU 上尝试它。

【讨论】:

  • 感谢您的回答。实际上内核应该没问题,我确实在 CPU 上开发它,现在我试图在 GPU 上运行它。此外,我的计算机并没有崩溃,直到我重新启动它才能恢复。只有视频输出会冻结,我的内核一直处于活动状态,但是一旦完成,我的计算机就可以正常运行,甚至不会报告任何错误...
【解决方案3】:

我是 opencl 的新手,遇到了类似的问题。我发现一个简短的计算工作正常,但一个较长的计算会冻结鼠标光标。对于我的问题,Windows 在托盘区域留下了一个黄色三角形,并在事件日志中放置了一条关于“显示驱动程序停止响应并已恢复”的消息。我找到的解决方案是将计算分解为每个不超过几秒钟的小部分。这些背靠背运行,但显然让视频驱动程序足够让它开心。如果我将 global_work_size 设置为足够高的值以最大化吞吐量,视频响应会非常缓慢,但驱动程序重启/鼠标冻结问题永远不会发生。

【讨论】:

  • 感谢您的回答,我查看了事件查看器,但没有发现任何警告等痕迹。我用我的新算法的伪代码编辑了我的问题。这就是你想要打破计算的方式吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多