Непрямая многопоточность - это стратегия, в которой каждая реализация кода операции имеет свой собственный JMP
для следующего кода операции. Патч к интерпретатору Python выглядит примерно так:
add:
result = a + b;
goto *opcode_targets[*next_instruction++];
opcode_targets
отображает инструкцию в байт-коде языка в ячейку памяти реализации кода операции. Это быстрее, потому что предиктор ветвления процессора может делать разные предсказания для каждого байт-кода, в отличие от оператора switch
, который имеет только одну инструкцию ветвления.
Компилятор должен поддерживать вычисленное goto, чтобы это работало, что в основном означает gcc.
Прямая многопоточность аналогична, но при прямой многопоточности массив кодов операций заменяется указателями на вложения кода операции следующим образом:
goto *next_opcode_target++;
Эти методы полезны только потому, что современные процессоры конвейерны и должны очищать свои конвейеры (медленно) в неправильно предсказанной ветви. Разработчики процессоров используют прогнозирование ветвлений, чтобы избежать необходимости частой очистки конвейера, но предсказание ветвлений работает только для ветвей, которые с большей вероятностью выберут определенный путь.