The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Серьёзное снижение производительности ядра 5.19, вызванное защитой от атаки Retbleed, opennews (??), 12-Сен-22, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


91. "Серьёзное снижение производительности ядра 5.19, вызванное з..."  +1 +/
Сообщение от n00by (ok), 12-Сен-22, 17:43 
> Ну и скорость - смотря как сравнивать, например байткод Эльбрусы выполняют/интерпретируют
> медленнее (и будут медленнее как минимум до релиза 7-й версии архитектуры).

Мне казалось, что Эльбрус наоборот должен выигрывать, поскольку в ВМ предсказатель переходов не очень работает. Но зависит от байткода и ВМ, конечно.

Ответить | Правка | К родителю #15 | Наверх | Cообщить модератору

239. "Серьёзное снижение производительности ядра 5.19, вызванное з..."  +/
Сообщение от erthink (ok), 13-Сен-22, 13:28 
>> Ну и скорость - смотря как сравнивать, например байткод Эльбрусы выполняют/интерпретируют
>> медленнее (и будут медленнее как минимум до релиза 7-й версии архитектуры).
> Мне казалось, что Эльбрус наоборот должен выигрывать, поскольку в ВМ предсказатель переходов
> не очень работает. Но зависит от байткода и ВМ, конечно.

ВМ - более абстрактная вещь, но если говорить о байткоде, то предсказание переходов работает не плохо.
Очень хорошо предсказываются все служебные переходы, leaf-циклы и более-менее ветвления в них.

Но основное замедление не из-за отсутствия предсказателя, а из-за отсутствия спекулятивного выполнения и низкой заполняемости ШК (широких команд).

Переименование регистров и спекулятивное выполнение позволяет out-of-order ЦПУ начать выполнять следующий и даже через-один элемент байт-кода. Тогда как на VLIW каждый элемент байт-кода в большинстве случаев требует выполнения нескольких крайне рыхлых ШК.

Ответить | Правка | Наверх | Cообщить модератору

275. "Серьёзное снижение производительности ядра 5.19, вызванное з..."  +/
Сообщение от n00by (ok), 13-Сен-22, 17:14 
>>> Ну и скорость - смотря как сравнивать, например байткод Эльбрусы выполняют/интерпретируют
>>> медленнее (и будут медленнее как минимум до релиза 7-й версии архитектуры).
>> Мне казалось, что Эльбрус наоборот должен выигрывать, поскольку в ВМ предсказатель переходов
>> не очень работает. Но зависит от байткода и ВМ, конечно.
> ВМ - более абстрактная вещь, но если говорить о байткоде, то предсказание
> переходов работает не плохо.
> Очень хорошо предсказываются все служебные переходы, leaf-циклы и более-менее ветвления
> в них.

Похоже, я что-то недопонимаю. Допустим, у абстрактного процессора есть 256 команд. Их исполняет switch в цикле. Какие-то опкоды можно сгруппировать, в итоге получаем 32 case. При компиляции такой «ВМ» окажется, что switch представляет из себя косвенный переход по таблице адресов в памяти. При таком количестве предсказание на основе истории переходов работает не очень, вот что пишет Интел:

B.8.3.2
Virtual Tables and Indirect Calls
17. Virtual Table Usage: BR_IND_CALL_EXEC / INST_RETIRED.ANY
A high value for the ratio Virtual Table Usage indicates that the code includes many indirect calls. The
destination address of an indirect call is hard to predict.

и вот что рекомендует, что бы упростить предсказание:

Assembly/Compiler Coding Rule 14. (M impact, L generality) When indirect branches are
present, try to put the most likely target of an indirect branch immediately following the indirect
branch. Alternatively, if indirect branches are common but they cannot be predicted by branch
prediction hardware, then follow the indirect branch with a UD2 instruction, which will stop the
processor from decoding down the fall-through path.

Для тестов реализовал интерпретатор байт-кода OCaml на асме AMD64, при этом вместо косвенного перехода по таблице вычислял адрес обработчика умножением на степень двойки (на старых поколениях архитекруры это было бы быстрее, поскольку исключается чтение адреса из памяти).

Вот такие печальные результаты предсказателя из perf stat


    12 440 035 801      instructions:u            #    0,48  insn per cycle
     1 039 998 618      branch-misses:u           #   33,33% of all branches

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

execute_instruction:
    mov    eax, [opcode]
    shl    rax, instruction_size_log2
+;    Переход никогда не происходит. Предотвращает предсказания следующего
+;    косвенного перехода, во многих случаях некорректные.
+    jc    .stop
    lea    rax, [rax + vm_base + vm_base_lbl - execute_instruction]
    next_opcode
    jmp    rax
-    ud2
+.stop:    ud2

Здесь промахов нет, но обратите внимание - всего одна инструкция за такт, что явно меньше возможного.

    11 600 026 289      instructions:u            #    1,21  insn per cycle
        80 002 443      branch-misses:u           #    3,51% of all branches

Последние результаты блики к оригинальному интерпретатору, написанному на Си. В той реализации файл с байткодом считывается в память и каждый опкод заменяется адресом обработчика, в последствии исполняется расширением GCC goto *ptr.

Если же опкодов мало и их обработчики объёмные, тогда предсказатель должен повести себя лучше, но много ли таких ВМ?

> Но основное замедление не из-за отсутствия предсказателя, а из-за отсутствия спекулятивного
> выполнения и низкой заполняемости ШК (широких команд).
> Переименование регистров и спекулятивное выполнение позволяет out-of-order ЦПУ начать
> выполнять следующий и даже через-один элемент байт-кода. Тогда как на VLIW
> каждый элемент байт-кода в большинстве случаев требует выполнения нескольких крайне рыхлых
> ШК.

По-моему, в примере выше процессор не знает, что ему можно исполнить.

Ответить | Правка | Наверх | Cообщить модератору

321. "Серьёзное снижение производительности ядра 5.19, вызванное з..."  +/
Сообщение от erthink (ok), 13-Сен-22, 20:18 
>[оверквотинг удален]
> +; Переход никогда не происходит. Предотвращает предсказания следующего
> +; косвенного перехода, во многих случаях некорректные.
> + jc .stop
>   lea rax, [rax + vm_base + vm_base_lbl - execute_instruction]
>   next_opcode
>   jmp rax
> - ud2
> +.stop: ud2
>
> Здесь промахов нет, но обратите внимание - всего одна инструкция за такт,

Всё примерно верно, но только иначе.

Базовый паттерн goto jump_table[*bytecode_ip++], соответственно out-of-order процессор может "узнать" адрес перехода еще до реального выполнения инструкций перед goto.
Условных переходов тут нет (можно избавиться), поэтому предсказывать нечего.

Если же инструкция байткода соответствует условному переходу, то вот тогда может участвовать предсказатель.
И у всех современных ЦПУ он будет работать и верно предсказывать переходы в случае циклов в байткоде.

Сложно возникают только если в байткоде есть цикл, а внутри него оператор if, которые реализуются через один опкод, но в актуальном коде работают в разных плечах.
Тогда просто предсказатель начинает путаться, но штеудовский во многих случаях умеет подстраиваться (работает по принципу электронной гадалки).

Как-то так.

Ответить | Правка | Наверх | Cообщить модератору

396. "Серьёзное снижение производительности ядра 5.19, вызванное з..."  +/
Сообщение от n00by (ok), 17-Сен-22, 08:14 
>[оверквотинг удален]
> Базовый паттерн goto jump_table[*bytecode_ip++], соответственно out-of-order процессор
> может "узнать" адрес перехода еще до реального выполнения инструкций перед goto.
> Условных переходов тут нет (можно избавиться), поэтому предсказывать нечего.
> Если же инструкция байткода соответствует условному переходу, то вот тогда может участвовать
> предсказатель.
> И у всех современных ЦПУ он будет работать и верно предсказывать переходы
> в случае циклов в байткоде.
> Сложно возникают только если в байткоде есть цикл, а внутри него оператор
> if, которые реализуются через один опкод, но в актуальном коде работают
> в разных плечах.

Да, те замеры проводились на байткоде, полученном вот из такого исходника:


let rec tailcall4 a b c d =
  if a < 0
  then b
  else tailcall4 (a-1) (b+1) (c+2) (d+3)
По-моему, цикл с выходом по условию - достаточно частая конструкция.

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

То есть Интел хорошо работает не во всех случаях. Соответственно, когда это критично, интерпретаторы и/или исполняемую программу оптимизируют с учётом особенностей имеющегося процессора. Под Эльбрус собирают уже готовое, а не под него спроектированное. Возможно, это не решающий фактор, но наверняка играет роль. Если так, то получается, что имеющийся «бесплатный» открытый код отчасти представляет собой эдакий чемодан без ручки, реальная цена за него - это негатив к Эльбрусу.

> Как-то так.

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру