循环展开 - Microblaze C编程

3

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

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

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

这对Microblaze可行吗?如果是,是否有相应的示例?
2个回答

3

不,没有像那样的自动循环展开。对于像这样的紧密循环,在Xilinx论坛上的常见建议是手动展开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); 
} 

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


非常感谢您提供的详细信息。那么您的意思是说(手动展开循环),我可以节省在for循环内部条件语句中产生的计算量?这很好。但问题是MB将访问多端口存储控制器(在我的应用程序中),因此我需要多个线程,每个线程访问一个端口。我该如何解决这个问题? - gpuguy

0

我收到了来自Xilinx的回复(尽管我还没有验证):

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

-funroll-loops 部分

SDK GUI 中提供了不同的 -O 优化开关,可能会执行循环展开,因为它启用了 -floop-optimize,该选项说明如下:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接