正如标题所说,当我跑我OpenCL的内核整个屏幕停止重绘(图像显示在监视器上,直到我的程序与计算做仍然是相同的这是真实的,即使在情况下,我从我的笔记本电脑上拔下它,然后重新插入-八方通显示相同的图像)并且计算机似乎也没有对鼠标移动作出反应 - 光标停留在相同的位置.
我不确定为什么会这样.它可能是我程序中的错误,还是标准行为?
在Google上搜索时,我在AMD的论坛上找到了这个帖子,有些人认为这是正常的,因为当GPU忙于计算时,GPU无法刷新屏幕.
如果这是真的,还有什么方法可以解决这个问题吗?
我的内核计算可能需要几分钟的时间,并且我的计算机实际上几乎无法使用整个时间真的很痛苦.
EDIT1:这是我目前的设置:
编辑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);
}
Run Code Online (Sandbox Code Playgroud)
所以现在我将整个工作负载分成主机并以块的形式发送到GPU.对于每个数据块,我将新内核排入队列,我从中得到的结果以正确的偏移量附加到输出数组.
这是你的意思,计算应该划分?
这似乎是解决冻结问题的方法,现在我能够处理比可用GPU内存大得多的数据,但我还是要做一些好的性能测量,看看什么是好的块大小.. .