Pull to refresh

Comments 33

А насколько большой прирост быстродействия даст использование новых инструкций именно в ядре ОС? Оно всё же не занимается высокопроизводительными вычислениями. Скажем, хэши, как упоминалось в статье, можно хорошо оптимизировать. А в целом как? Есть смысл?

учитывая современную любовь к насыщенному интерфейсу, теней и полупрозрачности, графическая подсистема могла бы получить заметный выигрыш от вектора особенно на мобильных процессорах

На сколько я понимаю, за всё это отвечает графическая подсистема, а не сам CPU, разве не так?

Насколько я понимаю, виндовый GDI не ускоряется видеокартой. Только, начиная с WPF, пошли подвижки

Я без понятия, в общем-то, на счёт внутренних отрисовок в приложениях, но почти на 100% уверен что основные элементы, такие как окна, тени окон, просто тени (не рисуемые вручную) используют для этого графическую подсистему. В общем, кто-то знающий детали наверняка отпишет в этот тред.
Еще в win98 использовалось аппаратное ускорение для BitBlt: www.asmcommunity.net/forums/topic/?id=8610
Рисовать графику процессором — очень медленно.

Да и все современные графические системы (SurfaceFlinger, Weston, WPF, Xorg) пытаются делать композицию аппаратно. При чем аппаратно — это не OpenGL/Direct3D. Это — поддержка нескольких слоев видеокартой.
Например, для SurfaceFlinger — OpenGL является fallback опцией, если композицию не удалось сделать аппаратными средствами. А делать композицию на CPU, он, кажется, совсем не умеет.
Некоторые новые инструкции предназначены именно для ускорения ядра, например XSAVEOPT, XSAVEC, XSAVES.
Абсолютно бессмысленный тест. Бинарные сборки компилируются для охвата большинства компьютеров присутствующих на рынке. Идеология Unix — совместимость на уровне исходного кода, а не бинарников. Поэтому «run time» адаптацию под процессор почти никто не делает. Хотите использовать расширенные инструкции в ядре — перекомпилируйте ядро на своей машине.Хотите использовать расширенные инструкции в приложении — перекомпилируйте приложение
Хотите использовать расширенные инструкции в ядре — перекомпилируйте ядро на своей машине. Хотите использовать расширенные инструкции в приложении — перекомпилируйте приложение

Не совсем верно. Многие инструкции нужно использовать явно, да и для компилятора автоматическая векторизация кода — задача не из простых. Поэтому если в исходном коде не предусмотрено использование этих инструкций, то их не будет и в бинарнике.

gcc очень неплохо справляется с векторизацией. Намного лучше, чем большинство известных мне программистов…
Главный вопрос: а много ли существует задач, для которых векторизация вообще возможна?
Это другой вопрос. Ну для обработки изображений все очевидно. Для ОС — наверное шифровка-дешифровка, контрольные суммы, те же memset-memcopy

Замечание по разделу "векторные инструкции":


На деле используются только скалярные инструкции векторных расширений. Пример: арифметика с плавающей точкой. 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

1. И много ли подобных кусков кода в ядрах операционных систем?
2. Часто ли критичный код компилируется с параметром оптимизации, большим, чем O2?
И много ли подобных кусков кода в ядрах операционных систем

Не могу Вам ответить, я занимаюсь обработкой изображений
Часто ли критичный код компилируется с параметром оптимизации, большим, чем O2

Если программа не работает с O3 или O4 — значит вы не умеете ее готовить :)
Справедливости ради, более или менее это стало нормально работать совсем недавно.
  1. Если я ничего не путаю, в ядре вообще нет работы с float'ами.


  2. Насчет -O3 не могу с вами согласиться. В том же gcc просто тонны багов, которые не возникают при более безопасном -O2 и ниже. Пруфы добываются в их багтрекере. Причем из них большая часть самого неприятного характера — miscompilation, т.е. компилятор выдает бинарники которые делают не то что должна делать программа.


  3. А зачем вы принудительно делаете -mavx? Пусть оно само решает, использовать его или нет, м?


  4. Гентушники обычно предпочитают более безопасный вариант:

-march=native -mtune=native -O2

1 естественно нет. Зато есть int32 в soft raid например и не только там
2 в целом согласен, однако баги исправляются, а в заголовке статьи речь идёт не только об ОС но и о приложениях.
3 потому что я хочу в данном коде именно AVX, а не SSE 4.2 например
4 а Вы попробуйте скомпилировать с О3. Если Ваша программа перестала работать то 99.9% это именно баги в исходном коде а не компиляторе.
Во многом проблемы с компилятором связанны именно с интелем. Весьма экзотические ограничения на выравнивание памяти для векторных инструкций, впрочем ситуация исправляется потихоньку. Большая часть крешей была связана именно с выравниванием
а Вы попробуйте скомпилировать с О3. Если Ваша программа перестала работать то 99.9% это именно баги в исходном коде а не компиляторе.

А если падает сам компилятор? У меня такое один раз было.


Во многом проблемы с компилятором связанны именно с интелем. Весьма экзотические ограничения на выравнивание памяти для векторных инструкций, впрочем ситуация исправляется потихоньку. Большая часть крешей была связана именно с выравниванием

Эта проблема актуальна только для древних процессоров. Современные процессоры нормально работают с невыровненными данными, даже без значимого падения произодительности.

1 Уронить компилятор несложно… язык template полный по Тьюрингу.
2 Таких древних на руках ровно половина. Вам накидать код который будет валиться на выравнивании на старых i7?
> 2 Таких древних на руках ровно половина. Вам накидать код который будет валиться на выравнивании на старых i7?

Я знаю, что доступ к невыровненным данным с вызывает исключение на процессорах, не поддерживающих AVX. Но начиная с AVX, такой проблемы больше нет.

И да, из-за этого есть проблема с написанием legacy-кода, использующего только SSE. На своём компьютере всё работает прекрасно, но гарантии, что невыровненного доступа нет, нет.
«Но гарантии нет»
Ну вот я и говорю что проблема не с операционкой или компилятором, а с зоопарком процессоров на руках у пользователей и написать бинарные или даже в исходники для оптимальной работы на всём зоопарке просто нереально. Есть ещё и атомы всякие обрезанные и армы и мипсы и тд Линукс ведь много платформ поддерживает.
UFO just landed and posted this here
Кроме х86 ничего нет? Хотя да, нету.

А что, SSE/AVX где-то ещё есть?

UFO just landed and posted this here
А почему Вы решили, что SSE регистров только 8? В 64-битном их 16.

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
Да, действительно — моя ошибка. Мне почему-то казалось, что возможность использования 16 регистров появилась с подержкой AVX.
Библиотека OpenSSL содержит много оптимизаций. Часть из них задается при компиляции, а часть включается на основании определения поддерживаемых инструкций в рантайме
Можете рассказать, как принимается решение о добавлении инструкций?
Почему-то ничего не сказано про винду.
При этом новые выпуски без новых инструкций не работают:

  1. 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.
  2. 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).

Было бы здорово!

Извиняюсь за оффтопик, но новые версии Intel IT Manager Game выходить будут когда-нибудь? Помню первую версию — великолепная игра была. Или коды на github выложите.
Sign up to leave a comment.