正如标题所说,当我跑我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内存大得多的数据,但我仍然不得不做出一些很好的性能测试,看看有什么好处块大小...
你的配置是什么? – 2013-04-23 18:51:03
不知道你的配置是什么意思,但我用我当前的硬件设置的信息更新了我的问题。 – jcxz 2013-04-23 19:33:21
是的,你有正确的想法来划分工作量。 – chippies 2013-04-26 13:26:48