OpenCL计算冻结了屏幕

时间:2013-04-23 17:45:59

标签: opencl freeze

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

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

在Google上搜索时,我在AMD的论坛上找到了this帖子,有些人认为这是正常的,因为当GPU忙于计算时,GPU无法刷新屏幕。

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

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

EDIT1:这是我目前的设置:

  • 显卡是ATI Mobility Radeon HD 5650,配备512 MB内存和AMD网站上的最新Catalyst beta驱动程序
  • 图形可切换 - 英特尔集成/ 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内存大得多的数据,但我还是要做一些好的性能测量,看看什么是好块大小...

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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