C++ GPU是否具有定期清除缓冲区的能力?

C++ GPU是否具有定期清除缓冲区的能力?,c++,opencl,C++,Opencl,我找到了一种将长期运行的算法分解为并行块的方法。我不太明白我在OpenCL中实现这一点的方法是否会奏效 对我来说,其中一个障碍是,对于我正在计算的“结果”,我不知道每个任务执行时会期望多少结果 例如,我的计划是创建一个缓冲区,它有足够的空间容纳10个结果,另一个缓冲区只存储一个值,指示缓冲区是否已满 我的另一个问题是,我可能会启动许多任务,我不想预先计算输入到一个大的长缓冲区中,因为这可能是相当多的数据,我只想在启动每个任务之前计算输入 例如,这是尝试的方法的一些伪代码: * Create a

我找到了一种将长期运行的算法分解为并行块的方法。我不太明白我在OpenCL中实现这一点的方法是否会奏效

对我来说,其中一个障碍是,对于我正在计算的“结果”,我不知道每个任务执行时会期望多少结果

例如,我的计划是创建一个缓冲区,它有足够的空间容纳10个结果,另一个缓冲区只存储一个值,指示缓冲区是否已满

我的另一个问题是,我可能会启动许多任务,我不想预先计算输入到一个大的长缓冲区中,因为这可能是相当多的数据,我只想在启动每个任务之前计算输入

例如,这是尝试的方法的一些伪代码:

* Create a vector to store all results
* Create the "results" buffer.
* Create the "is-filled" buffer to store whether results buffer was filled.

while (some condition) {
    // Before task.
    * Create the "input" buffer with data (input data comes from an expensive function).
    * Update kernel arguments.

    // Run task.
    queue.enqueueTask(kernel);

    // After task.
    * Read the "is-filled" buffer to determine whether "results" buffer is full.
    if ("results" buffer is full) {
       * Read the "results" buffer into the vector.
       * Read the "input" buffer (now changed to indicate next inputs to 'resume' task)
       * Reset "results" & "is-filled" buffers
    }

}

Read remaining "results" buffer into the vector.
这感觉很尴尬,如果有其他方法来处理缓冲区填充,那么我想知道

不过,最令人担忧的是“任务后”部分会阻止执行并阻止并行性的发生

因此,我的问题是平行性的障碍;结果数量可变,并在每个任务之前更改参数。我尝试的工作流可能问题更大:)

你将如何处理这个问题

我发现了这样一条线索,询问者谈到在工人等待时定期清理缓冲区。但是我找不到任何关于这项技术的细节。

然后使用双缓冲。这会让所有的事情同时发生。谢谢,我有多个缓冲区在工作。我所做的是在每个循环开始时写入一个缓冲区,在循环结束时对向量向量进行非阻塞读取,并在循环结束后和使用数据之前调用queue.finish()。这意味着我正在向设备发送更多的内存。我可能需要第二个循环,或者将整个过程包装在另一个循环中,以返回并恢复缓冲区已满的任何任务,尽管现在不太可能发生;我可能仍然应该处理这种情况。也许您可以使用事件而不是if(“结果”缓冲区已满)?因此,如果该部件可以独立工作,则该部件可以驱动其余部件,而不是在每个步骤进行检查。到目前为止,您是否通过双缓冲获得了更高的性能?谢谢,我正在研究如何使用事件。是的,看起来我正在与新的缓冲方法同时执行。您能详细说明一下使用事件与主机通信缓冲区已满的想法吗?