事件同步 - 2023.2 简体中文

Vitis 统一软件平台文档 应用加速开发 (UG1393)

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 简体中文

基于 OpenCL 队列的所有 API 调用均为异步调用。在命令队列中,当命令入队后,将立即返回这些命令。要暂停主机程序以等待结果,或者要解决命令之间的任何依赖关系,都可使用 API 调用(如 clFinish clWaitForEvents )来阻止执行主机程序。

以下代码显示了 clFinishclWaitForEvents 的示例。

err = clEnqueueTask(command_queue, kernel, 0, NULL, NULL);
// Execution will wait here until all commands in the command queue are finished
clFinish(command_queue); 

// Create event, read memory from device, wait for read to complete, verify results
cl_event readevent;
// host memory for output vector
int host_mem_output_ptr[MAX_LENGTH]; 
//Enqueue ReadBuffer, with associated event object 
clEnqueueReadBuffer(command_queue, dev_mem_ptr, CL_TRUE, 0, sizeof(int) * number_of_words, 
  host_mem_output_ptr, 0, NULL, &readevent );
// Wait for clEnqueueReadBuffer event to finish
clWaitForEvents(1, &readevent); 
// After read is complete, verify results
... 

请注意以上示例中这些命令的使用方式:

  1. clFinish API 已显式用于阻止主机执行,直至内核执行完成为止。这是很有必要的,否则主机可能过早尝试从 FPGA 缓冲器回读,并且可能读取垃圾数据。
  2. 从 FPGA 存储器到本地主机的数据传输是通过 clEnqueueReadBuffer 完成的。此处 clEnqueueReadBuffer 的最后一个实参会返回事件对象,用于识别这条特定读取命令,并且可用于查询事件或者等待这条特定命令完成。clWaitForEvents 命令可指定单一事件(读取事件),并等待以确保数据完成后再验证数据。