ZHCU881D May 2020 – May 2024
为了纠正前面示例中由循环携带依赖导致的问题,我们需要告知编译器,这些数组在存储器中不重叠,因此一个迭代与下一个迭代之间不存在存储器依赖关系。
许多常见的数字信号处理循环包含一个或多个加载操作、一些计算以及一个存储操作。通常,加载从数组中读取,存储则将值存储到数组。如果编译器不知道数组是独立的(或不重叠),那么编译器必须是保守的,并假定在迭代 i+1
或 i+2
等的加载中可能需要存储迭代 i
。因此,重要的是务必告知编译器负载和存储数组是否位于完全不同的存储器区域(也就是说,指向的对象/数组不重叠)。
为此,我们可以使用 restrict(限制)
关键字来实现这一点。此关键字告知编译器,在整个变量范围内(用于访问数组的数组名称或指针名称),只能通过该数组名称或指针名称访问该对象或数组。
使用restrict (限制)关键字允许有效地告知编译器,存储到存储器的数据不会写入下一次迭代的加载所读取的位置。因此,当编译器执行软件流水线时,连续的迭代可以重叠,从而使生成的代码运行得更快。
此 C 函数示例使用了restrict (限制)关键字。生成的软件流水线信息注释块将显示,使用restrict (限制)关键字时,循环携带依赖限制为 0,而分区资源限制为 2。这会将大大缩短两个周期的启动间隔 (ii)。
void weighted_sum(int * restrict a, int *restrict b, int *restrict out,
int weight_a, int weight_b, int n)
尽管restrict (限制)关键字不是 C++14 或 C++17 标准中的一部分,但米6体育平台手机版_好二三四 (TI) C7000 C/C++ 编译器允许在 C 和 C++ 模式中使用restrict (限制)关键字。