Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCL中命令的提交时间和开始时间之间的长时间_Opencl - Fatal编程技术网

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

OpenCL中命令的提交时间和开始时间之间的长时间,opencl,Opencl,我在一个大阵列上运行内核。当我分析clEnqueueNDRange命令时,执行时间(结束-开始)为.001毫秒,但提交和开始(开始-提交)之间的时间约为120毫秒,这取决于输入数据的大小。提交命令直到开始执行时会发生什么情况。得到这么长的时间合理吗 OpenCL异步运行。也就是说,当你要求完成一项工作时,它可能不会在那个时候发生。这将在将来的某个时候发生。这有点奇怪,特别是当你开始分析东西的时候,但它是这样工作的,这样CPU就可以为OpenGL设备排队处理大量的工作,然后在工作完成后再去做其他的

我在一个大阵列上运行内核。当我分析clEnqueueNDRange命令时,执行时间(结束-开始)为.001毫秒,但提交和开始(开始-提交)之间的时间约为120毫秒,这取决于输入数据的大小。提交命令直到开始执行时会发生什么情况。得到这么长的时间合理吗

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

例如:

clEnqueueWriteBuffer(blah);
clEnqueueNDRange(blah);
clEnqueueReadBuffer(blah, but blocking_read = CL_TRUE);
在这里,writeBuffer和NDRange可能会花费很少的时间。他们所要做的就是记录下需要做的事情。阻塞readBuffer将花费很长时间,因为它必须等待读取的结果。为了完成读操作,写操作和内核执行必须在读操作开始之前完成

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

我不太明白你的问题在衡量什么,但我想你看到的是这种影响。工作时间由其他职能部门承担,因为他们必须等待以前的工作完成


了解哪些函数导致CPU等待GPU是编写高性能代码的一大技巧。每当您引入这样的等待时,CPU都会停止执行任何有用的工作,而GPU很可能会在CPU准备下一个任务时处于空闲状态。有时,没有其他选择,您只能等待。

在您的clEnqueueNDRange调用之后,是否有需要内核结果的内容?例如,在内核之后是否有一个阻塞的clEnqueueMapBuffer?如果没有,实现可能会决定延迟内核的执行。是的,在那之后我有两个clEnqueueReadBuffer来读取结果,但我无法使用非阻塞调用读取结果。另外,克伦奎埃马布弗似乎有一些问题,给了我错误的结果。无论如何,是否可以通过非阻塞调用读取数据?