Юрий Юревич
Наиболее верный (на мой взгляд) вариант 2.2; однако по производительности он сильно уступает варианту 1.
Данный эксперимент посвящен проблеме оптимизации численных расчетов используя исключительно свободные инструменты и свободное окружение.
Железная часть:
Программная часть:
В ходе теста планируется сравнить влияние на производительность численного расчета следующих факторов:
Измерения производятся одним синтетическим тестом и четырьмя реальными приложениями:
Scimark2 дает для анализа следующие параметры (единицы измерения mflops):
Для приближения к реальным условиям, scimark2 используется с параметром -large.
Производительность реальных приложений измеряется в обратных секундах: скомпилированная программа запускается через вызов time и в качестве показателя берется real time.
Относительная производительность каждой вариации измеряется в процентах. За сто процентов берется следующая (базовая) конфигурация:
-O2 -march=i386 -mcpu=i386Каждый из тестов для каждой вариации повторяется три раза, затем вычисляется среднее значение и погрешность измерения.
Для определения итоговой значимости вариации каждого фактора определяется среднее с учетом веса каждого теста. Используются следующие веса для тестов:
За точку отсчета в 100% для каждого теста взяты следующие показатели:
| # | Тип теста | Тест | Показатель | Погрешность | Относительная погрешность |
| 1 | real | 3D | 756.75 с | 0.66 с | 0.09% |
| 2 | FI | 417.56 с | 0.39 с | 0.09% | |
| 3 | GL | 454.16 с | 0.27 с | 0.06% | |
| 4 | PO | 1372.13 с | 0.04 с | 0.003% | |
| 5 | synthetic | FFT | 21.31 mflops | 0.13 mflops | 0.64% |
| 6 | LU | 162.98 mflops | 0.04 mflops | 0.03% | |
| 7 | MC | 51.84 mflops | 0.03 mflops | 0.06% | |
| 8 | SM | 127.02 mflops | 0.03 mflops | 0.02% | |
| 9 | SOR | 323.23 mflops | 0.19 mflops | 0.06% |
-O2 -march=i386 -mcpu=i386На графике изображен относительный прирост производительности при смене дистрибутива с Woody на Sarge

Средний прирост (с учетом веса каждого теста): (9.79 ± 1.44)%
Т.е. в большинстве случаев при смене дистрибутива с Woody на Sarge ожидается прирост производительности численных расчетов порядка 10% при прочих равных.
-O2 -march=i386 -mcpu=i386На графике изображен относительный прирост производительности (в процентах от производительности базовой системы) при смене ядра 2.4.26-i386 на вариационное ядро.

Средний прирост (с учетом веса каждого теста):

Т.о. в большинстве случаев есть смысл менять ядро с 2.4.x на 2.6.x; при этом ожидаемый прирост будет в пределах 1-2%. А вот сборка ядра под k7-архитектуру практически ничего не дает: почти все тесты показали результаты в пределах погрешности измерений.
-O3 -march=i386 -mcpu=i386
-O3 -march=i686 -mcpu=i386
-O3 -march=i386 -mcpu=i386
-O3 -march=i686 -mcpu=i386
-O3 -march=i686 -mcpu=i686 -mmmx -msse
-O3 -march=i686 -mcpu=i686 -mmmx -msse -mfpmath=sse
-O3 -march=pentium3 -mcpu=pentium3 -fomit-frame-pointer \ -fforce-addr -falign-functions=4 -fprefetch-loop-arrays
-O3 -march=athlon -mcpu=athlon -O3 -fomit-frame-pointer \ -ffast-math -fforce-addr -falign-functions=4 \ -funroll-loops -msse
-O3 -march=athlon-tbird -mcpu=athlon-tbird -fomit-frame-pointer \ -fforce-addr -falign-functions=4 -funroll-loops \ -maccumulate-outgoing-args -msse
-O3 -march=athlon-xp -mcpu=athlon-xp -fomit-frame-pointer \ -ffast-math -fforce-addr -falign-functions=4 -funroll-loops \ -maccumulate-outgoing-args -frerun-cse-after-loop \ -frerun-loop-opt -fprefetch-loop-arrays -msse -mfpmath=sse
На графике изображен относительный прирост производительности (в процентах от производительности базовой системы) при различных опциях сборки тестов.

Средний прирост (с учетом веса каждого теста):

По данному фактору можно сказать следующее: для большинства программ оптимальным будет использование сборки под athlon; дальнейшая оптимизация дает либо такой же (athlon-xp), либо худший результат (athlon-tbird).
-O3 -march=athlon -mcpu=athlon -O3 -fomit-frame-pointer \ -ffast-math -fforce-addr -falign-functions=4 \ -funroll-loops -msse
Ниже на графике представлен прирост производительности (в процентах от производительности базовой системы) при оптимальной конфигурации. Оптимальная не в смысле "самая быстрая для каждого из тестов", а в смысле "самая быстрая для всех тестов суммарно".

Средний прирост (с учетом веса каждого теста): (67.77 ± 1.27)%
Показатели тестов оптимальной конфигурации:
| # | Тип теста | Тест | Производительность | |
| Базовая конфигурация | Оптимальная конфигурация | |||
| 1 | real | 3D | 756.75 ± 0.66 с | 699.47 ± 4.57 с |
| 2 | FI | 417.56 ± 0.39 с | 130.65 ± 0.23 с | |
| 3 | GL | 454.16 ± 0.27 с | 280.53 ± 0.31 с | |
| 4 | PO | 1372.13 ± 0.04 с | 564.40 ± 0.02 с | |
| 5 | synthetic | FFT | 21.31 ± 0.13 mflops | 22.91 ± 0.03 mflops |
| 6 | LU | 162.98 ± 0.04 mflops | 174.21 ± 0.02 mflops | |
| 7 | MC | 51.84 ± 0.03 mflops | 107.37 ± 0.02 mflops | |
| 8 | SM | 127.02 ± 0.03 mflops | 136.82 ± 0.18 mflops | |
| 9 | SOR | 323.23 ± 0.19 mflops | 375.80 ± 0.21 mflops | |
Отдавая дань уважения авторам программ, упомянем оптимальные конфигурации для каждого из реальных тестов. Для C-версий оптимальная конфигурация для всех совпадает с оптимальной для каждого. В случае с fortran-версией наибольшее быстродействие1 достигается при оптимизации под i386, т.е. с флагами -O3 -march=i386 -mcpu=i386. Любые другие виды оптимизации приводят к падению производительности программы 3D.
Итог таков: различными методами можно достичь в среднем 65-70% прироста производительности программ численного счета. При этом наиболее значимым фактором (55-60%) остается выбор компилятора и флагов оптимизации. Смена дистрибутива же дает "бонусных" 5-10% к уже скомпилированным программам. Такая картина характерна для платформы AMD2
В заключение, выражаю благодарность Рябову Е. Г. и Косенко Г. И. за идею, моральную поддержку и предоставленные программы.
____ 1 В итоге, для 3D имеем следующие результаты: прирост в производительности 35.46 ± 0.35 %. Абсолютное значение времени выполнения: 558.67 ± 0.24 с.
2 Судя по ранее проводимым сравнениям (но, к сожалению, не опубликованных) Рябова Е. Г., для платформы Intel характерна более низкая производительность при малых уровнях оптимизации и существенный рост быстродействия при высоких уровнях оптимизации под архитектуру p4.