在 C 中,我有一项任务,我必须使用分配为二维数组(数组的数组)的巨大矩阵进行乘法、求逆、移位、加法等。
我找到了 gcc 标志-funroll-all-loops
。如果我理解正确,这将自动展开所有循环,而无需程序员的任何努力。
我的问题:
a) gcc 是否包括这种带有各种优化标志等的-O1
优化 -O2
?
b)我是否必须pragma
在我的代码中使用任何 s 来利用循环展开或循环自动识别?
c)如果展开可以提高性能,为什么默认不启用此选项?
d)有哪些推荐的 gcc 优化标志以尽可能最好地编译程序?(我必须运行这个针对单个 CPU 系列优化的程序,这与我编译代码的机器相同,实际上我使用march=native
和-O2
标志)
编辑
似乎在使用 unroll 方面存在争议,在某些情况下可能会降低性能。在我的情况下,有多种方法可以在 2 个嵌套循环中进行简单的数学运算,以迭代为大量元素完成的矩阵元素。在这种情况下,展开如何会减慢或提高性能?