专家你好,能不能讲讲如何利用编译器优化循环的方法

waruqi 2008-05-12 07:16:49
如何利用编译器优化循环
什么时候可以进行循环展开呢
...全文
116 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
waruqi 2008-05-13
  • 打赏
  • 举报
回复
那如果循环内部是一组数据无关的复杂函数,而不是简单的几条指令,能否使用 #pragma ivdep 进行优化
比如
for (int i = 0; i < m; i++)
func(i);
intel_iclifort 2008-05-13
  • 打赏
  • 举报
回复
能够利用编译器优化循环, 最主要的就是要消除循环的数据依赖性, 或者说循环是独立的, 否则编译器很难采用向量化(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, 那么优化可能会导致非法操作

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧