3

我们可以使用 EDK 在 Microblaze C 编程中展开循环吗?

这是必需的,因为我需要更多性能。传统上,我的 C 代码将串行运行,因此使用一些编译器指令展开循环可以加速我的应用程序。
(例如,就像我们使用 openMP 所做的那样)。

#pragma Unroll 
for (i = 0; i < 100; i++ ) {
    a[i] = fetch_data(i);
}

这对 Microblaze 来说可能吗?如果是的话,有没有同样的例子?

4

2 回答 2

3

不,没有任何像那样的自动循环展开。对于像这样的紧密循环,赛灵思论坛上的常见建议是手动展开 10-20 次,看看性能是否可以接受,或者在汇编中编写循环代码。

您通常会在每个循环分支上丢失 3 或 4 个时钟周期,因此根据 fetch_data 执行所需的时间,您可以确定要展开多少。

for (i = 0; i < 100; i+=10 ) { 
    a[i] = fetch_data(i); 
    a[i+1] = fetch_data(i+1); 
    a[i+2] = fetch_data(i+2); 
    a[i+3] = fetch_data(i+3); 
    a[i+4] = fetch_data(i+4); 
    a[i+5] = fetch_data(i+5); 
    a[i+6] = fetch_data(i+6); 
    a[i+7] = fetch_data(i+7); 
    a[i+8] = fetch_data(i+8); 
    a[i+9] = fetch_data(i+9); 
} 

确保注意标准循环展开警告,例如注意不是增量步长倍数的间隔大小。

于 2012-05-02T04:17:11.430 回答
0

我收到了 Xilinx 的回复(虽然我还没有验证):

http://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Optimize-Options.html

-funroll-loops 部分

不同的 -O 优化开关(直接在 SDK GUI 中可用)可能会进行循环展开,因为它启用了 -floop-optimize 哪些状态:

-floop-optimize 执行循环优化:将常量表达式移出循环,简化退出测试条件,并可选择进行强度降低和循环展开。

在-O、-O2、-O3、-Os 级别启用。

于 2012-05-03T12:24:22.193 回答