OpenCL计算冻结了屏幕

OpenCL计算冻结了屏幕,opencl,freeze,Opencl,Freeze,正如标题所说,当我运行我的OpenCL内核时,整个屏幕停止重画(在我的程序完成计算之前,显示器上显示的图像保持不变。即使我将其从笔记本上拔下并插回电源,这一点也是正确的-始终显示相同的图像)而且计算机似乎对鼠标移动也没有反应——光标保持在相同的位置 我不知道为什么会这样。这可能是我程序中的一个bug,还是一种标准行为 在谷歌上搜索时,我在AMD的论坛上找到了一条线索,一些人认为这很正常,因为当GPU忙于计算时,它无法刷新屏幕 如果这是真的,还有办法解决这个问题吗 我的内核计算可能需要几分钟的时间

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

我不知道为什么会这样。这可能是我程序中的一个bug,还是一种标准行为

在谷歌上搜索时,我在AMD的论坛上找到了一条线索,一些人认为这很正常,因为当GPU忙于计算时,它无法刷新屏幕

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

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

EDIT1:这是我当前的设置:

  • 图形卡是ATI Mobility Radeon HD 5650,具有512 MB内存和AMD网站上最新的Catalyst beta驱动程序
  • 图形是可切换的-Intel integrated/ATI专用卡,但 我已禁用BIOS切换,因为否则我无法获取 在Ubuntu上工作的驱动程序
  • 操作系统是Ubuntu 12.10(64位),但在Windows7(64位)上也是如此
  • 我通过HDMI插入显示器(但笔记本电脑屏幕冻结) 也是,所以这应该不是问题)
EDIT2:所以在玩了一天我的代码之后,我从你的回答中得到了建议,并将我的算法改成了这样(在伪代码中):

for(cl\u ulong chunk=0;chunk
所以现在我在主机上拆分整个工作负载,并将其分块发送到GPU。对于每个数据块,我将一个新内核放入队列,从中得到的结果将以正确的偏移量附加到输出数组中

你的意思是计算应该被分开吗


这似乎是解决冻结问题的方法,甚至现在我能够处理比可用GPU内存大得多的数据,但我还需要进行一些良好的性能测试,以确定好的块大小…

我是opencl新手,遇到了类似的问题。我发现短时间的计算可以,但长时间的计算会冻结鼠标光标。对于我的问题,Windows在任务栏区域留下一个黄色三角形,并在事件日志中显示一条消息“显示驱动程序已停止响应并已恢复”。我找到的解决方案是将计算分解成几个小部分,每个部分只需几秒钟。这些都是背靠背的,但显然让视频驱动程序进入了足够的空间,让它保持愉快。如果我将“全局工作大小”设置为足够高的值以最大化吞吐量,视频响应会非常慢,但驱动程序重新启动/鼠标冻结问题从未发生。

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

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

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


如果要在GPU上运行长内核,则必须禁用GPU的超时检测和恢复,或使超时延迟超过最大内核运行时间(更好,因为仍然可以捕获错误),请参阅以了解如何执行此操作。

不确定您的配置指的是什么,但我用当前硬件设置的信息更新了我的问题。是的,你对分配工作量的想法是正确的。好的,谢谢你的确认,我想我会接受你的回答并结束这个话题,因为这基本上解决了我目前的问题。我可能还会进行额外的调试,并试图找出是否还有其他原因导致暂停,但我认为我不会很快有任何结果…感谢您的回答和链接。我查看了它,也查看了我的寄存器,但是我唯一的条目是
TdrDelay
,它被设置为60,这很有趣,因为MSDN链接声明默认值是2秒,我不记得更改了任何一个。此外,即使我的内核可以运行2-4分钟(取决于输入),我也从未经历过我的应用程序过早结束的经历(我认为如果系统在GPU上杀死我的内核,结果会是这样)。另外,尽管运行了那么长时间,结果仍然是正确的…感谢您的回答,我查看了事件查看器,但没有发现任何警告或类似的痕迹。我用新算法的伪代码编辑了我的问题。这就是你想要打破计算的方式吗?谢谢你的回答。实际上内核应该很好,我确实在CPU上开发了它,现在我尝试在GPU上运行它。而且我的电脑在某种意义上并没有崩溃,在我重新启动它之前它无法恢复。只有视频输出将冻结,例如w
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);
}