0

我在一个大阵列上运行一个内核。当我分析 clEnqueueNDRange 命令时,执行时间(结束-开始)为 0.001 毫秒,但提交和开始(开始-提交)之间的时间约为 120 毫秒,这随输入数据的大小而变化。提交命令直到它开始执行时会发生什么。获得这么大的时间是否合理?

4

1 回答 1

0

OpenCL 以异步方式运行。也就是说,当你要求完成一项工作时,它可能不会在那个时候发生。它会在未来的某个时间发生。这有点奇怪,尤其是当您开始分析事物时,但它的工作原理是这样的,以便 CPU 可以为 OpenGL 设备排队大量工作,然后在工作完成时去做其他事情。

例如:

clEnqueueWriteBuffer(blah);
clEnqueueNDRange(blah);
clEnqueueReadBuffer(blah, but blocking_read = CL_TRUE);

在这里,writeBuffer 和 NDRange 可能会花费很少的时间。他们所要做的就是记录需要做的事情。阻塞的 readBuffer 会花费很长时间,因为它要等待读取的结果。为了完成读取,写入和内核执行必须在读取开始之前完成。

现在读取可能非常小,但是因为它正在等待它之前的所有内容完成它似乎花费的时间取决于它之前的命令中的工作量。

我不太明白你从你的问题中衡量了什么,但我希望你看到的是这种效果。工作时间被计入其他职能部门,因为他们必须等待之前的工作完成。

在编写高性能代码时,了解哪些函数会导致 CPU 在 GPU 上等待是一大技巧。任何时候你引入这样的等待,CPU 都会停止做任何有用的工作,GPU 很可能会在 CPU 准备下一个工作块时空闲。有时,别无选择,您只能等待。

于 2012-05-31T17:16:17.890 回答