基于 OpenCL 队列的所有 API 调用均为异步调用。在命令队列中,当命令入队后,将立即返回这些命令。要暂停主机程序以等待结果,或者要解决命令之间的任何依赖关系,都可使用 API 调用(如
clFinish
或
clWaitForEvents
)来阻止执行主机程序。
以下代码显示了 clFinish
和 clWaitForEvents
的示例。
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
...
请注意以上示例中这些命令的使用方式:
-
clFinish
API 已显式用于阻止主机执行,直至内核执行完成为止。这是很有必要的,否则主机可能过早尝试从 FPGA 缓冲器回读,并且可能读取垃圾数据。 - 从 FPGA 存储器到本地主机的数据传输是通过
clEnqueueReadBuffer
完成的。此处clEnqueueReadBuffer
的最后一个实参会返回事件对象,用于识别这条特定读取命令,并且可用于查询事件或者等待这条特定命令完成。clWaitForEvents
命令可指定单一事件(读取事件),并等待以确保数据完成后再验证数据。