ZHCUAU3J January 2018 – March 2024
与上一节中的示例不同,以下示例未进行转换,因为 len1
和 len2
可能会超过 SE 的 32 位字段的大小,并且循环计数器可能会超过 32 位值:
void example2(char *in, char *restrict out, long len1, long len2)
{
for (long i = 0; i < len1; i++)
for (long j = 0; j < len2; j++)
out[i*len1 + j] = in[i*len1 + j];
}
实际上,这种寻址模式几乎总是映射到流,尽管仍有可能出现边缘情况。此类情况包括但不限于:
有关如何对流编程的详细信息,请参阅节 4.15.6。
使用 --assume_addresses_ok_for_stream 选项可让编译器忽略诸如此类边缘情况。使用此选项可使 example2
以与 example1
相同的方式进行转换。
如果在 SE 或 SA 打开并进行函数调用时使用了 --auto_stream=no_saving 选项,则可能生成不正确的代码。在这种情况下,如果编译器自动使用 SE 或 SA,则已打开的 SE 或 SA 的状态将丢失。
如果使用了 --auto_stream 且配置了 L1D 并将其用作 SRAM,也可能生成不正确的代码。在这种情况下,尝试使用 SE 访问 L1D 会失败。