2013-04-23 109 views
4

正如标题所说,当我跑我OpenCL内核整个屏幕停止重绘(直到我的程序与计算做监视器上显示的图像是一样的。这是真实的,即使在情况下,我拔掉它从我的笔记本电脑中插回来 - 总是显示相同的图像),并且计算机似乎也不会对鼠标移动做出反应 - 光标停留在相同的位置。的OpenCL计算冻结屏幕

我不知道为什么会发生这种情况。它可能是我的程序中的一个错误,或者这是一个标准的行为?

在Google上搜索时,我在AMD的论坛上发现了this线程,一些人认为这很正常,因为当GPU忙于计算时,它无法刷新屏幕。

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

我的内核计算可能需要几分钟的时间,并有我的电脑几乎不能用于整个那段时间真的很痛苦。

EDIT1:这是我的当前设置:

  • 显卡是ATI的Mobility Radeon HD 5650与512 MB的内存和最新的Catalyst测试版驱动程序从AMD网站
  • 显卡可切换 - 英特尔集成/ 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内存大得多的数据,但我仍然不得不做出一些很好的性能测试,看看有什么好处块大小...

+0

你的配置是什么? – 2013-04-23 18:51:03

+0

不知道你的配置是什么意思,但我用我当前的硬件设置的信息更新了我的问题。 – jcxz 2013-04-23 19:33:21

+0

是的,你有正确的想法来划分工作量。 – chippies 2013-04-26 13:26:48

回答

5

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

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

如果您要在GPU上运行长内核,那么您必须禁用GPU的超时检测和恢复,或者使超时延迟超过最大内核运行时间(最好能够捕获错误),请参见here去做这个。

+0

感谢您的回答和链接。我也看过它和我的寄存器,但是我唯一拥有的条目是'TdrDelay',它被设置为60,这很有趣,因为MSDN链接指出默认值是2秒,而我没有记得改变其中的任何一个。而且,即使我的内核可以运行2-4分钟(取决于输入),我从来没有经历过我的应用程序的过早结束(这就是我认为如果系统在GPU上杀死了我的内核,结果会如何)。尽管这么长时间,结果仍然是正确的... ... – jcxz 2013-04-25 11:58:48

1

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

+0

感谢您的回答,我查看了事件查看器,但我没有发现任何警告或此类的痕迹。我用我的新算法的伪代码编辑了我的问题。这是你打算如何分解计算? – jcxz 2013-04-25 12:02:31

2

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

+0

感谢您的回答。其实内核应该没问题,我在CPU上开发它,现在我试图在GPU上运行它。此外,我的电脑没有崩溃,只有重新启动后才能恢复。只有视频输出会冻结,整个过程中我的内核处于活动状态,但一旦完成,我的电脑就可以正常运行,甚至不会报告任何错误... – jcxz 2013-04-25 12:06:57

+0

祝您好运。如果您找到解决方案,请发布。 – 2013-04-25 12:23:33