OpenCL,我是否需要使用事件来同步同一命令队列中的内核启动?
OpenCL, do I need to use events to synchronize kernel launches inside the same command queue?
我不确定这是否有必要。我有两个需要串行启动的内核。我是否需要为第一个事件创建一个事件,然后让第二个内核启动等待该事件,或者我是否可以假设队列中的所有内容都按照我放置它的顺序执行?我在下面的代码中使用 cl_event 是必要的吗?
cl_event acceleration_finished;
cl_check(clEnqueueNDRangeKernel(cmdq, acceleration_kernel, 1, NULL, &acceleration_blocks,
&acceleration_threads, 0, NULL, &acceleration_finished));
cl_event stepper_finished;
cl_check(clEnqueueNDRangeKernel(cmdq, stepper_kernel, 1, NULL, &N,
NULL, 1, &acceleration_finished, &stepper_finished));
cl_double3* positions_mapped = clEnqueueMapBuffer(cmdq, positions, CL_TRUE, CL_MAP_READ, 0,
sizeof(cl_double3) * N, 1, &stepper_finished, NULL, &error);
cl_check(error);
对于您的情况,您可以假设完全按顺序执行(如果您没有手动启用乱序)。
OpenCL 中有两种类型的队列:
顺序(默认):
- 任务按照排队的顺序执行。如果它们中的任何一个因任何原因阻塞,则在该任务完成之前,所有以下任务都不会执行。
- 事件仍在用于检查给定任务是否可以启动。
乱序(使用标志 CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE
创建):
任务在准备好被消费时立即执行(它们依赖的所有事件都是CL_COMPLETED
)。
这并不意味着如果N个任务不相互依赖,它们可以运行在一个队列中并行。某些硬件不支持该行为,需要创建一个单独的队列以允许并行执行任务。其他一些硬件一次只支持一项任务。这取决于实现。
https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clCreateCommandQueue.html
我不确定这是否有必要。我有两个需要串行启动的内核。我是否需要为第一个事件创建一个事件,然后让第二个内核启动等待该事件,或者我是否可以假设队列中的所有内容都按照我放置它的顺序执行?我在下面的代码中使用 cl_event 是必要的吗?
cl_event acceleration_finished;
cl_check(clEnqueueNDRangeKernel(cmdq, acceleration_kernel, 1, NULL, &acceleration_blocks,
&acceleration_threads, 0, NULL, &acceleration_finished));
cl_event stepper_finished;
cl_check(clEnqueueNDRangeKernel(cmdq, stepper_kernel, 1, NULL, &N,
NULL, 1, &acceleration_finished, &stepper_finished));
cl_double3* positions_mapped = clEnqueueMapBuffer(cmdq, positions, CL_TRUE, CL_MAP_READ, 0,
sizeof(cl_double3) * N, 1, &stepper_finished, NULL, &error);
cl_check(error);
对于您的情况,您可以假设完全按顺序执行(如果您没有手动启用乱序)。
OpenCL 中有两种类型的队列:
顺序(默认):
- 任务按照排队的顺序执行。如果它们中的任何一个因任何原因阻塞,则在该任务完成之前,所有以下任务都不会执行。
- 事件仍在用于检查给定任务是否可以启动。
乱序(使用标志
CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE
创建):任务在准备好被消费时立即执行(它们依赖的所有事件都是
CL_COMPLETED
)。这并不意味着如果N个任务不相互依赖,它们可以运行在一个队列中并行。某些硬件不支持该行为,需要创建一个单独的队列以允许并行执行任务。其他一些硬件一次只支持一项任务。这取决于实现。
https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clCreateCommandQueue.html