Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/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 clEnqueueReadBuffer?_Opencl_Gpgpu - Fatal编程技术网

内核执行期间的OpenCL clEnqueueReadBuffer?

内核执行期间的OpenCL clEnqueueReadBuffer?,opencl,gpgpu,Opencl,Gpgpu,当OpenCLclEnqueueReadBuffer操作发生时,排队的内核能否继续执行 换句话说,clenqueueradbuffer是设备上的阻塞操作吗?从主机API的角度来看,clenqueueradbuffer可以是阻塞还是不阻塞,这取决于您是否将阻塞读取参数设置为CL\u TRUE或CL\u FALSE 如果将其设置为not block(不阻塞),则读取将进入队列,您应该使用事件(或后续阻塞调用)确定读取何时完成(即,在访问正在读取的内存之前) 如果将其设置为block,则在读取完成之前

当OpenCL
clEnqueueReadBuffer
操作发生时,排队的内核能否继续执行


换句话说,
clenqueueradbuffer
是设备上的阻塞操作吗?

从主机API的角度来看,clenqueueradbuffer可以是阻塞还是不阻塞,这取决于您是否将阻塞读取参数设置为CL\u TRUE或CL\u FALSE

如果将其设置为not block(不阻塞),则读取将进入队列,您应该使用事件(或后续阻塞调用)确定读取何时完成(即,在访问正在读取的内存之前)

如果将其设置为block,则在读取完成之前,调用不会返回。正在读取的内存将是正确的。另外(并回答您的实际问题)在clEnqueueReadBuffer之前排队的任何操作都必须在读取开始之前首先完成(请参见下面的异常注释)

所有的clEnqueue*API调用都是异步的,但有些调用具有可以设置的“阻塞”参数。使用它相当于使用非阻塞版本,然后调用clFinish。命令队列将刷新到设备,并且在工作完成之前,主机线程不会继续。当然,要让GPU一直忙着这样做是很困难的,因为现在它没有任何工作,但是如果你把新工作排得足够快,你仍然可以让它相当忙

这一切都假定有一个顺序一致的命令队列。如果您的命令队列出现故障,并且您的设备支持故障队列,则排队的项目可以按照不违反您提供的事件等待列表参数的任何顺序执行。同样,您可以有多个命令队列,这些命令队列可以按照不违反您提供的事件\u等待\u列表参数的任何顺序执行。通常,它们用于重叠内存传输和计算,并使多个计算单元保持忙碌。无序命令队列和多个命令队列都是OpenCL的高级概念,在您完全理解并拥有有序命令队列的经验之前,不应该尝试

在DarkZeros指出OP问题的“在设备上”部分后,随后又补充了澄清:我的回答是从主机线程API的角度出发的。在设备上,使用顺序命令队列,所有下游命令都会被当前命令阻止。对于无序队列,它们只会被事件等待列表阻止。然而,在今天的驱动程序中,无序命令队列并没有得到很好的支持。对于多个命令队列,理论上,命令只会被先前的命令(如果按顺序)和事件等待列表阻止。实际上,有时会有特殊的供应商规则来阻止您可能喜欢的潜在非阻塞命令的自由流动。这通常是因为多个OpenCL命令队列被传输到设备端内存和计算队列,并在那里按顺序执行。因此,根据向多个命令队列中添加命令的顺序,它们可能以次优方式阻塞的方式交错。我所知道的最佳解决方案是,要么小心排队顺序(基于对本实现细节的了解),要么使用一个队列存储,一个队列计算,这与设备端排队相匹配


如果内存和计算重叠是您的目标,AMD和NVIDIA都提供了如何重叠内存和计算操作的示例,对于支持多个计算操作的GPU,也提供了如何重叠内存和计算操作的示例。NVIDIA示例很难找到,但它们已经存在了(从CUDA 4天开始)。

从主机API的角度来看,clEnqueueReadBuffer可以是阻塞还是不阻塞,这取决于您是否将blocking\u read参数设置为CL\u TRUE或CL\u FALSE

如果将其设置为not block(不阻塞),则读取将进入队列,您应该使用事件(或后续阻塞调用)确定读取何时完成(即,在访问正在读取的内存之前)

如果将其设置为block,则在读取完成之前,调用不会返回。正在读取的内存将是正确的。另外(并回答您的实际问题)在clEnqueueReadBuffer之前排队的任何操作都必须在读取开始之前首先完成(请参见下面的异常注释)

所有的clEnqueue*API调用都是异步的,但有些调用具有可以设置的“阻塞”参数。使用它相当于使用非阻塞版本,然后调用clFinish。命令队列将刷新到设备,并且在工作完成之前,主机线程不会继续。当然,要让GPU一直忙着这样做是很困难的,因为现在它没有任何工作,但是如果你把新工作排得足够快,你仍然可以让它相当忙

这一切都假定有一个顺序一致的命令队列。如果您的命令队列出现故障,并且您的设备支持故障队列,则排队的项目可以按照不违反您提供的事件等待列表参数的任何顺序执行。同样,您可以有多个命令队列,这些命令队列可以按照不违反您提供的事件\u等待\u列表参数的任何顺序执行。通常,它们用于重叠内存传输和计算,并使多个计算单元保持忙碌。无序命令队列和多个命令队列都是OpenCL的高级概念,在您完全理解并拥有有序命令队列的经验之前,不应该尝试

在DarkZeros指出OP问题的“在设备上”部分后,随后又补充了澄清:我的回答是从主机线程API的角度出发的。在设备上,使用顺序命令队列,所有下游命令都会被当前命令阻止。用一个无序的q