Comments 33
А насколько большой прирост быстродействия даст использование новых инструкций именно в ядре ОС? Оно всё же не занимается высокопроизводительными вычислениями. Скажем, хэши, как упоминалось в статье, можно хорошо оптимизировать. А в целом как? Есть смысл?
учитывая современную любовь к насыщенному интерфейсу, теней и полупрозрачности, графическая подсистема могла бы получить заметный выигрыш от вектора особенно на мобильных процессорах
Насколько я понимаю, виндовый GDI не ускоряется видеокартой. Только, начиная с WPF, пошли подвижки
Рисовать графику процессором — очень медленно.
Да и все современные графические системы (SurfaceFlinger, Weston, WPF, Xorg) пытаются делать композицию аппаратно. При чем аппаратно — это не OpenGL/Direct3D. Это — поддержка нескольких слоев видеокартой.
Например, для SurfaceFlinger — OpenGL является fallback опцией, если композицию не удалось сделать аппаратными средствами. А делать композицию на CPU, он, кажется, совсем не умеет.
Хотите использовать расширенные инструкции в ядре — перекомпилируйте ядро на своей машине. Хотите использовать расширенные инструкции в приложении — перекомпилируйте приложение
Не совсем верно. Многие инструкции нужно использовать явно, да и для компилятора автоматическая векторизация кода — задача не из простых. Поэтому если в исходном коде не предусмотрено использование этих инструкций, то их не будет и в бинарнике.
Замечание по разделу "векторные инструкции":
На деле используются только скалярные инструкции векторных расширений. Пример: арифметика с плавающей точкой. SSE-инструкции удобнее и эффективнее, чем их x87 аналоги. AVX же даёт выигрыш за счёт большего числа регистров (16 регистров в 64-битном режиме против 8 SSE). Другой пример: memset/memcpy — использование 256-битных регистров более эффективно, чем 128-битных.
На деле используются только скалярные инструкции векторных расширений
Вы глубоко ошибаетесь. Вот простейший код test1.cpp:
void summ(float* src1,float* src2,int n)
{
for(int k=0;k<n;k++)
{
src1[k]+=src2[k];
}
}
gcc -O4 -march=native -mavx -ffast-math -funroll-loops -S test1.cpp
// кусочек листа из середины
.L8:
vmovups (%rax,%r8), %ymm14
addl $8, %r13d
vaddps (%r10,%r8), %ymm14, %ymm15
vmovaps %ymm15, (%r10,%r8)
vmovups 32(%rax,%r8), %ymm0
vaddps 32(%r10,%r8), %ymm0, %ymm1
vmovaps %ymm1, 32(%r10,%r8)
vmovups 64(%rax,%r8), %ymm2
vaddps 64(%r10,%r8), %ymm2, %ymm3
vmovaps %ymm3, 64(%r10,%r8)
vmovups 96(%rax,%r8), %ymm4
vaddps 96(%r10,%r8), %ymm4, %ymm5
vmovaps %ymm5, 96(%r10,%r8)
vmovups 128(%rax,%r8), %ymm6
vaddps 128(%r10,%r8), %ymm6, %ymm7
vmovaps %ymm7, 128(%r10,%r8)
vmovups 160(%rax,%r8), %ymm8
vaddps 160(%r10,%r8), %ymm8, %ymm9
vmovaps %ymm9, 160(%r10,%r8)
vmovups 192(%rax,%r8), %ymm10
vaddps 192(%r10,%r8), %ymm10, %ymm11
vmovaps %ymm11, 192(%r10,%r8)
vmovups 224(%rax,%r8), %ymm12
vaddps 224(%r10,%r8), %ymm12, %ymm13
vmovaps %ymm13, 224(%r10,%r8)
addq $256, %r8
cmpl %r11d, %r13d
jb .L8
2. Часто ли критичный код компилируется с параметром оптимизации, большим, чем O2?
И много ли подобных кусков кода в ядрах операционных систем
Не могу Вам ответить, я занимаюсь обработкой изображений
Часто ли критичный код компилируется с параметром оптимизации, большим, чем O2
Если программа не работает с O3 или O4 — значит вы не умеете ее готовить :)
Справедливости ради, более или менее это стало нормально работать совсем недавно.
Если я ничего не путаю, в ядре вообще нет работы с float'ами.
Насчет -O3 не могу с вами согласиться. В том же gcc просто тонны багов, которые не возникают при более безопасном -O2 и ниже. Пруфы добываются в их багтрекере. Причем из них большая часть самого неприятного характера — miscompilation, т.е. компилятор выдает бинарники которые делают не то что должна делать программа.
А зачем вы принудительно делаете -mavx? Пусть оно само решает, использовать его или нет, м?
- Гентушники обычно предпочитают более безопасный вариант:
-march=native -mtune=native -O2
2 в целом согласен, однако баги исправляются, а в заголовке статьи речь идёт не только об ОС но и о приложениях.
3 потому что я хочу в данном коде именно AVX, а не SSE 4.2 например
4 а Вы попробуйте скомпилировать с О3. Если Ваша программа перестала работать то 99.9% это именно баги в исходном коде а не компиляторе.
Во многом проблемы с компилятором связанны именно с интелем. Весьма экзотические ограничения на выравнивание памяти для векторных инструкций, впрочем ситуация исправляется потихоньку. Большая часть крешей была связана именно с выравниванием
а Вы попробуйте скомпилировать с О3. Если Ваша программа перестала работать то 99.9% это именно баги в исходном коде а не компиляторе.
А если падает сам компилятор? У меня такое один раз было.
Во многом проблемы с компилятором связанны именно с интелем. Весьма экзотические ограничения на выравнивание памяти для векторных инструкций, впрочем ситуация исправляется потихоньку. Большая часть крешей была связана именно с выравниванием
Эта проблема актуальна только для древних процессоров. Современные процессоры нормально работают с невыровненными данными, даже без значимого падения произодительности.
2 Таких древних на руках ровно половина. Вам накидать код который будет валиться на выравнивании на старых i7?
Я знаю, что доступ к невыровненным данным с вызывает исключение на процессорах, не поддерживающих AVX. Но начиная с AVX, такой проблемы больше нет.
И да, из-за этого есть проблема с написанием legacy-кода, использующего только SSE. На своём компьютере всё работает прекрасно, но гарантии, что невыровненного доступа нет, нет.
Ну вот я и говорю что проблема не с операционкой или компилятором, а с зоопарком процессоров на руках у пользователей и написать бинарные или даже в исходники для оптимальной работы на всём зоопарке просто нереально. Есть ещё и атомы всякие обрезанные и армы и мипсы и тд Линукс ведь много платформ поддерживает.
Intel® 64 and IA-32 Architectures Software Developer’s Manual:
In 64-bit mode, eight additional XMM registers are accessible. Registers XMM8-XMM15 are accessed by using REX prefixes
При этом новые выпуски без новых инструкций не работают:
- Windows 8.0: The minimum system requirements for Windows 8 are slightly higher than those of Windows 7. The CPU must support the Physical Address Extension (PAE), NX bit, and SSE2.
- Windows 8.1: To install a 64-bit OS on a 64-bit PC, your processor needs to support CMPXCHG16b, PrefetchW, and LAHF/SAHF
Ничего не сказали про Clear Linux, который улучшала Intel (использование новых инструкций процессоров Intel).
Здесь сравнивают 15 выпусков Linux (в т.ч. — Clear Linux).
Могу тоже ее перевести.
Вопрос: действительно ли программное обеспечение использует новые наборы инструкций?