Multithreading 使用clenqueemapbuffer和';查询命令是否已完成';

Multithreading 使用clenqueemapbuffer和';查询命令是否已完成';,multithreading,parallel-processing,opencl,Multithreading,Parallel Processing,Opencl,OpenCL 1.1标准规定(5.2.3): 如果阻塞映射为CL\U FALSE,即映射操作为非阻塞,则 指向由clEnqueueMapBuffer返回的映射区域的指针只有在map命令完成后才能使用。事件参数 返回可用于查询执行情况的事件对象 map命令的状态。map命令完成后,将显示 应用程序可以使用 clEnqueueMapBuffer返回的指针 但在(5.9,紧跟在表5.15之后)中有以下陈述: 使用clGetEventInfo确定由事件标识的命令是否已完成执行(即CL_event_com

OpenCL 1.1标准规定(5.2.3):

如果阻塞映射为CL\U FALSE,即映射操作为非阻塞,则 指向由clEnqueueMapBuffer返回的映射区域的指针只有在map命令完成后才能使用事件参数 返回可用于查询执行情况的事件对象 map命令的状态。map命令完成后,将显示 应用程序可以使用 clEnqueueMapBuffer返回的指针

但在(5.9,紧跟在表5.15之后)中有以下陈述:

使用clGetEventInfo确定由事件标识的命令是否已完成执行(即CL_event_command_execution_STATUS返回 CL_COMPLETE)不是同步点。没有 保证通过命令修改内存对象 与事件关联的将对其他排队命令可见


Q1:因此,我想知道是否有其他方法可以“查询执行情况” “映射命令”的状态,以及当查询返回“CL_COMPLETE”时是否保证内存一致性(在本例中为主机)?
Q2:我错过了什么吗?

Q3:在这种情况下,典型的OpenCL习惯用法是什么?

1-使用排队障碍,并从该命令获取事件,以具有可见性和与主机的细粒度同步

在while循环中等待它将使用更多的cpu,但至少是细粒度的

2-用于细粒度控制的事件。对可见性的等待和障碍

例如,clwaitforevents提供了这两种服务,并且使用的cpu比查询更少,但粒度更大

设备端仅使用事件网络在队列之间创建图形


3-没有任何典型的。选择最适合您的问题的机器

因此,我需要另一个“机器”来提供内存可见性保证。嗯,“细粒度”是指clWaitForEvents比轮询相应的事件带来更多的开销,对吗?事件网络不也用于在无序队列中创建任务图吗?支持这样的队列是一种普遍的选择吗?是的,等待需要更长的时间。对于事件,多队列同步是最快的,无序不是强制选项afaik。可选,是。但有趣的是,了解供应商是否提供无序队列的实现。从我们之前的讨论中,我得出了一个结论,您对许多供应商的实现都有经验。@parallelgeek我在amd gpu上尝试过ooo队列,它只是忽略了它,然后我没有在intel上尝试,因为amd已经领先opencl。英伟达也从远处跟随。我没有nvidia,但几年前有一些论坛用户尝试过我的程序。如果返回ooo启用的值,则查询CL_设备_队列_属性。即使它返回那个值,如果它仍然按顺序执行,我也不会感到惊讶。Opencl规范只说“不能保证命令是按顺序发出的”,这也隐含地说“不能保证命令不是按顺序发出的”