在某些情况下,如果每次调用内核时耗用的数据量不满一个数据窗口,或者如果在每次调用时生成的数据量不满一个数据窗口,那么您可以通过将内核端口声明为 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 以释放与该窗口对象关联的锁定。错误同步可能导致代码中出现死锁。