在C语言中,我必须使用分配为二维数组(数组的数组)的巨大矩阵执行乘法、求逆、转置、加法等操作。我发现gcc标志“-funroll-all-loops”。如果我理解正确,这将自动展开所有循环,程序员不需要作任何工作。
我的问题是:
a) gcc是否会通过各种优化标志(如-O1、-O2等)包括这种优化?
b) 我是否需要在代码中使用pragma来充分利用循环展开,或者是循环被自动识别?
c) 如果展开循环可以提高性能,为什么不将此选项设置为默认选项?
d) 推荐使用哪些gcc优化标志以最佳方式编译程序?(我必须为单个CPU家族运行此程序,并且与我编译代码的机器相同,实际上我使用march=native和-O2标志)
编辑
似乎有争议关于使用展开可能会减慢性能的情况。在我的情况下,有各种方法可以在2个嵌套的for循环中执行简单的数学运算,以迭代大量元素的矩阵。在这种情况下,循环展开如何减慢或增加性能?
我的问题是:
a) gcc是否会通过各种优化标志(如-O1、-O2等)包括这种优化?
b) 我是否需要在代码中使用pragma来充分利用循环展开,或者是循环被自动识别?
c) 如果展开循环可以提高性能,为什么不将此选项设置为默认选项?
d) 推荐使用哪些gcc优化标志以最佳方式编译程序?(我必须为单个CPU家族运行此程序,并且与我编译代码的机器相同,实际上我使用march=native和-O2标志)
编辑
似乎有争议关于使用展开可能会减慢性能的情况。在我的情况下,有各种方法可以在2个嵌套的for循环中执行简单的数学运算,以迭代大量元素的矩阵。在这种情况下,循环展开如何减慢或增加性能?
funroll-all-loops: ...这通常会使程序运行更慢。
它可能导致指令缓存未命中,并且代码大小将增加。它不是一项自动的好处。 - Ed S.-O
选项会添加-funroll-loops
或-funroll-all-loops
。 - IllusiveBrian