首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 专家你好,能不能讲讲如何利用编译器优化循环的方法 [已结贴,结贴人:waruqi]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 19:16:49 楼主
    如何利用编译器优化循环
    什么时候可以进行循环展开呢
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 19:27:591楼 得分:0
    该回复于2008-05-14 18:24:41被管理员删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 15:15:472楼 得分:100
    能够利用编译器优化循环, 最主要的就是要消除循环的数据依赖性, 或者说循环是独立的, 否则编译器很难采用向量化(vectorization)或者软件流水线(software pipelining)的方法提高执行性能

    在Intel编译器的手册中, 有专门的章节讨论这个话题 Using High-Level Optimizations (HLO).

    一个比较简单的方法来判定循环的独立性, 就是将循环的执行次序颠倒后, 看最后的结果, 是否和原先的相同.

    可以通过阅读编译器的优化报告来查看, 是否成功进行了循环优化, 不能进行的原因.  需要使用编译选项"-opt-report -opt-report-phasehlo"

    下面给出一个例子:
    Example 1
    void ignore_vec_dep(int *a, int k, int c, int m)
    {

      #pragma ivdep

      for (int i = 0; i < m; i++)
        a[i] = a[i + k] * c;
    }

    如果没有ivdep pragma, 编译器不会自动将该循环优化, 因为k的值未知,  如果k <0, 那么优化可能会导致非法操作
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 18:32:193楼 得分:0
    那如果循环内部是一组数据无关的复杂函数,而不是简单的几条指令,能否使用 #pragma ivdep 进行优化
    比如
    for (int i = 0; i  < m; i++)
        func(i);
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved