我打算写一个OpenCL的程序,在处理任务级庞大的数据量(没有进一步的并行是可能的,但数据量足够高) 数据本身是从一个文件,读结果应该写入另一个文件。 现在我认为它可能是最好的(最快)让1线程读取文件并将数据推送到内核,而另一个线程获取完成的数据并将其写入文件。 所以我实际上需要像ReadData-> CopyToDevice-> ExecuteKernel-> CopyToHost-> WriteData流中的OpenCL
有没有任何例子,如何做到最好?我会从10个数组开始(队列,InputMemory,OutputMemory,Events)。 第一个线程:读取数据,等待下一个事件条目为空,填入这个数组,下一个
第二个线程:事件!= null-> waitforevent,写入数据,将事件设置为空 或者可能使用10-信号量而不是检查空
内核本身处理固定大小和可变大小的输出的数据重叠这些操作。一个CPU可以做每秒数据集10K左右(〜150B每个) 所以我想关于给大约10K的数据集上每组31个工作项(31由于受到本地内存的要求)和少数群体分裂内核。 – Flamefire
所以我想,当我将数据传输到内核时,我可以在内核中对以前的数据集进行计算,并从磁盘读取下一个数据集的数据。所以它就像一个有四个阶段的管道:从磁盘读取,写入设备,处理数据/从设备读取,写入磁盘。 有一个例子在一个队列中进行计算,而另一个队列正在传输数据,而不是相反。所以相同的内核被实例化2次,并在2个队列中调用。内核甚至可以同时运行,给定足够的CU不能? – Flamefire
无法保证传输和执行如何以非阻塞模式(除了订单)进行安排。所以你可以使用相同的队列进行传输和执行。队列仅仅是发送GPU信息的抽象(内核执行或数据)。但为什么不尝试? – matthias