В C у меня есть задача, где я должен выполнять умножение, инверсию, преобразование, добавление и т.д. и т.д. с матрицами огромные, выделенными как двумерные массивы (массивы массивов).
Я нашел флаг gcc -funroll-all-loops
. Если я правильно понимаю, это автоматически разворачивает все петли без каких-либо усилий программиста.
Мои вопросы:
a) Включает ли gcc такую оптимизацию с различными флагами оптимизации как -O1
, -O2
и т.д.?
b) Должен ли я использовать любой pragma
внутри моего кода, чтобы воспользоваться возможностью циклирования цикла или автоматически идентифицировать петли?
c) Почему эта опция не включена по умолчанию, если разворот увеличивает производительность?
d) Каковы рекомендуемые флаги оптимизации gcc для компиляции программы наилучшим образом? (Я должен запустить эту программу, оптимизированную для одного семейства процессоров, то же самое на машине, где я компилирую код, на самом деле я использую флаги march=native
и -O2
)
ИЗМЕНИТЬ
Похоже, что существуют разногласия по поводу использования разворота, что в некоторых случаях может замедлить производительность. В моих ситуациях существуют различные методы, которые выполняют только математические операции в 2 вложенных циклах для итерации матричных элементов, выполняемых для огромного количества элементов. В этом случае, как unroll может замедлить или увеличить производительность?