首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环展开-Microblaze C编程

循环展开-Microblaze C编程
EN

Stack Overflow用户
提问于 2012-05-02 11:39:42
回答 2查看 1.7K关注 0票数 3

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

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

(例如,我们使用openMP)。

代码语言:javascript
复制
#pragma Unroll 
for (i = 0; i < 100; i++ ) {
    a[i] = fetch_data(i);
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-02 12:17:11

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

您通常会在每个循环分支上损失3到4个时钟周期,因此根据fetch_data执行的时间长短,您可以计算出您想要展开多少。

代码语言:javascript
复制
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); 
} 

一定要注意标准循环展开的注意事项,比如注意间隔大小不是增量步长的倍数。

票数 3
EN

Stack Overflow用户

发布于 2012-05-03 20:24:22

我从Xilinx那里得到了这样的回复(尽管我还没有证实这一点):

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

-funroll-loops部分

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10407389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档