【发布时间】:2014-06-13 00:40:46
【问题描述】:
在 C 语言中,我有一项任务,我必须使用分配为二维数组(数组的数组)的 巨大 矩阵进行乘法、求逆、移位、加法等操作。 p>
我找到了 gcc 标志 -funroll-all-loops。如果我理解正确,这将自动展开所有循环,而无需程序员的任何努力。
我的问题:
a) gcc 是否包含这种优化,以及 -O1、-O2 等各种优化标志?
b)我是否必须在我的代码中使用任何pragmas 才能利用循环展开或循环自动识别?
c)如果展开可以提高性能,为什么默认不启用此选项?
d) 有哪些推荐的 gcc 优化标志以尽可能最好地编译程序? (我必须运行这个针对单个 CPU 系列优化的程序,这与我编译代码的机器相同,实际上我使用 march=native 和 -O2 标志)
编辑
似乎在使用 unroll 方面存在争议,在某些情况下可能会降低性能。在我的情况下,有多种方法可以在 2 个嵌套循环中进行简单的数学运算,以迭代为大量元素完成的矩阵元素。在这种情况下,展开如何会减慢或提高性能?
【问题讨论】:
-
"如果展开提高性能,为什么默认不启用此选项?" - 来自文档:
funroll-all-loops: ...This usually makes programs run more slowly.。您可以命中指令缓存未命中,并且您的代码大小会增加。这不是一个自动的好处。 -
另外,循环展开并不总能提高性能。
-
回答 1,根据文档 Ed 没有提到任何
-O选项添加-funroll-loops或-funroll-all-loops。 -
那么什么时候展开循环有用,什么时候会减慢性能?
-
基本上所有操作都是在双嵌套for循环循环中完成的,以迭代矩阵元素,对每个元素进行简单的数学运算,在这种情况下我不知道为什么应该或不应该提高性能.