1

我将编写一个 OpenCL 程序,它在任务级别处理大量数据(无法进一步并行,但数据量足够高)数据​​本身是从文件中读取的,结果应该写入另一个文件. 现在我认为让 1 个线程读取文件并将数据推送到内核,而另一个线程获取完成的数据并将其写入文件可能是最好的(最快的)。所以我实际上需要类似 ReadData->CopyToDevice->ExecuteKernel->CopyToHost->WriteData

有没有什么例子,如何做到最好?我会从一个大约 10 个(队列、InputMemory、OutputMemory、Events)的数组开始。第一个线程:读取数据,等待下一个事件条目为空,填充此数组,下一个
第二个线程:事件!=null->waitforevent,写入数据,将事件设置为空或者可能使用 10-Semaphore 而不是检查无效的

4

2 回答 2

1

此外,使用单独的 OpenCL 命令队列进行上传、处理和下载,并使用 clEvents 在它们之间创建依赖关系。这将允许硬件在 GPU 支持时重叠这些操作

于 2012-12-28T01:05:34.497 回答
0

我正在为图像处理做类似的事情,但在考虑做任何事情之前,你应该实际分析一下瓶颈在哪里。我不知道您的内核的计算密集程度如何,但您不应低估 I/O。

首先:是的,总共使用三个线程可能是隐藏 I/O 延迟的好主意。但是十个命令队列太多了,每个 GPU 一个就绰绰有余了。此外,如果你只有一个 GPU,那么如果它只能处理一个,那么给它提供十个不同的缓冲区是没有意义的。所以你最好使用双缓冲策略和阻塞读写。

于 2012-12-27T11:17:22.870 回答