OpenCL中命令的提交和开始时间之间的长时间

时间:2012-05-07 13:36:53

标签: opencl

我正在大阵列上运行内核。当我分析clEnqueueNDRange命令时,执行时间(end-start)是.001 ms,但是提交和启动(start-submit)之间的时间大约是120 ms,这随输入数据的大小而变化。提交命令直到它开始执行时会发生什么。得到这么大的时间是否合理?

1 个答案:

答案 0 :(得分:0)

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

例如:

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

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

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

我不太明白你从问题中测量的是什么,但我希望你看到的是这种效果。工作时间由其他职能负责,因为他们必须等待以前的工作才能完成。

了解哪些函数会导致CPU在GPU上等待,这是编写高性能代码时的一个重要伎俩。每当你引入这样的等待时,CPU就会停止做任何有用的工作,并且当CPU准备下一个工作时,GPU可能会闲置。有时候,别无选择,你只需要等待。