stable
编译指示可用于标记数据流区域的输入变量或输出变量。其作用是移除其对应的同步,假定用户保证此移除行为确实正确无误。
void dataflow_region(int A[...], ...
#pragma HLS stable variable=A
#pragma HLS dataflow
proc1(...);
proc2(A, ...);
如果不使用 stable
编译指示,并假定 A
由 proc2
读取,那么 proc2
会成为其所在位置的数据流区域内执行的初始同步(通过 ap_start
)的一部分。这意味着仅当 proc2
同样准备好重新启动后,proc1
才能重新启动,这会阻止数据流迭代重叠,从而可能导致性能下降。stable
编译指示表明无需此同步亦可保持操作正确性。
在以上示例中,如无 stable
编译指示并假定 A
由 proc2
读取(因为 proc2
当前绕过任务),将出现性能损失。
通过
stable
编译指示,编译器假定:- 如果
A
由proc2
读取,那么执行dataflow_region
时,任何其它进程或调用上下文都不会覆盖读取的存储器位置。 - 如果
A
由proc2
写入,那么执行dataflow_region
时,任何其它进程或调用上下文在定义写入的存储器位置前都不会读取这些位置。
典型场景是仅当数据流区域尚未开始执行或者已完成执行时,调用程序才会更新或读取这些变量。