正如标题所述,当我运行我的
我不确定为什么会发生这种情况。这可能是我的程序中的错误吗,还是这是标准行为?
在谷歌上搜索时,我发现了AMD论坛上的this线程,有些人认为这是正常现象,因为GPU在进行计算时无法刷新屏幕。
如果这是真的,是否仍然有任何方法可以解决这个问题?
我的内核计算可能需要几分钟时间,并且在整个时间内让我的计算机几乎无法使用真的很痛苦。
编辑1:这是我的当前设置:
现在我将整个工作负载分成块,一部分在主机上处理,一部分发送到GPU。对于每个数据块,我都会排队一个新的内核,并将其结果附加到正确的偏移量处的输出数组中。
这是您所说的计算应该如何分割吗?
这似乎是解决冻结问题的方法,而且现在我能够处理比可用GPU内存更大的数据,但我还需要进行一些良好的性能测量,以确定适当的块大小...
OpenCL
内核时,整个屏幕停止重绘(显示器上的图像保持不变,直到我的程序完成计算。即使我将其从笔记本电脑上拔下并重新插入 - 始终显示相同的图像),计算机似乎也不会对鼠标移动做出反应 - 光标保持在同一位置。我不确定为什么会发生这种情况。这可能是我的程序中的错误吗,还是这是标准行为?
在谷歌上搜索时,我发现了AMD论坛上的this线程,有些人认为这是正常现象,因为GPU在进行计算时无法刷新屏幕。
如果这是真的,是否仍然有任何方法可以解决这个问题?
我的内核计算可能需要几分钟时间,并且在整个时间内让我的计算机几乎无法使用真的很痛苦。
编辑1:这是我的当前设置:
- 显卡是 ATI Mobility Radeon HD 5650,拥有512 MB的内存,并使用来自AMD官网的最新Catalyst beta驱动程序
- 显卡是可切换的 - Intel集成/ATI专用卡,但我在BIOS中禁用了切换,否则无法在Ubuntu上安装驱动程序。
- 操作系统是Ubuntu 12.10(64位),但在Windows 7(64位)上也会出现此问题。
- 我通过HDMI连接了我的显示器(但笔记本屏幕也会冻结,所以这不应该是问题)
编辑2:经过一天的代码调试,我采纳了你们的建议并将算法更改为以下伪代码:
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内存更大的数据,但我还需要进行一些良好的性能测量,以确定适当的块大小...