5

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

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

在谷歌上搜索时,我在 AMD 的论坛上发现了这个帖子,那里的一些人建议这是正常的,因为 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 内存大得多的数据,但我还必须进行一些良好的性能测量,看看什么是好的块大小.. .

4

3 回答 3

7

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

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

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

于 2013-04-24T12:41:03.700 回答
2

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

于 2013-04-24T08:07:12.670 回答
1

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

于 2013-04-24T02:16:53.913 回答