异步窗口访问 - 2022.1 简体中文

Versal ACAP AI 引擎编程环境 用户指南 (UG1076)

Document ID
UG1076
Release Date
2022-05-25
Version
2022.1 简体中文

在某些情况下,如果每次调用内核时耗用的数据量不满一个数据窗口,或者如果在每次调用时生成的数据量不满一个数据窗口,那么您可以通过将内核端口声明为 async 来控制缓冲器同步,如下所示。

 connect< window<128, 32> net1 (in, async(first.in[0])); 

此声明会告知编译器,进入内核时省略窗口缓冲器同步。使用读/写 API 访问窗口前,必须使用内核代码中所示的窗口同步 API,如以下示例所示

void super_kernel(input_window<int32> * data, output_window<int32> * result) {
  ...
  window_acquire(data);     // acquire input window unconditionally inside the kernel
  if (<somecondition>) {
    window_acquire(result); // acquire output window conditionally 
  }
  ...                       // do some computation with "data" and "result"
  window_release(data);     // release input window inside the kernel
  if (<somecondition>) {  
    window_release(result); // release output window conditionally
  }
  ...
};

window_acquire API 会执行相应的同步和初始化,以确保窗口对象可供读取或写入。此 API 会持续跟踪要内部获取的相应缓冲器指针和锁定,即使跨 AI 引擎处理器共享窗口并且可采用双重缓冲也是如此。此 API 可根据动态控制无条件或有条件调用,并且它属于潜在阻塞运算。您自行负责确保稍后执行(甚至可能在后续内核调用中执行)对应 window_release API 以释放与该窗口对象关联的锁定。错误同步可能导致代码中出现死锁。