Пока я радую свои графоманские пристрастия написанием детальной технической статьи про «Windows Performance Station», захотелось поделиться своими мыслями о том, что хорошего и плохого приносит SMT в процессоры «AMD» и «Intel», и как тут поможет «Windows Performance Station».

image

Тем, кому интересна данная тема, добро пожаловать под кат…


Итак, для начала давайте определимся, что такое SMT.

Как говорит нам википедия, SMT (от англ. simultaneous multithreading) это одновременная многопоточность, т.е. несколько потоков выполняются одновременно, а не последовательно, как это происходит во «временно?й многопоточности».

Многие знают эту технологию под названием «Intel Hyper-Threading», про неё уже всё давно написано, но до сих пор я сталкиваюсь с тем что многие разработчики, и, тем более, обыватели не понимают в чём основная суть «одновременного» выполнения нескольких команд одним ядром процессора и какие проблемы это несёт.

Для начала поговорим про временну?ю многопоточность. До реализации технологии SMT в виде «Hyper-Threading» использовалась технология «временно?й многопоточности».

Тут всё просто, представим, что у нас есть один конвейер и один рабочий (Ядро ЦП), который выполняет операции над числами и записывает результат. Предположим, для этих операций ему нужна отвёртка и гаечный ключ. Операционная система (ОС) складывает нашему рабочему на конвейер по порядку одну операцию для отвёртки, а за ней одну операцию для гаечного ключа. Один рабочий в один момент времени может оперировать или только гаечным ключом или только отвёрткой. Таким образом, выкладывая разное количество разных блоков, ОС определяет приоритет выполнения тех или иных операций от разных приложений. Пропорцию одних блоков к другим мы можем указывать внутри ОС, когда указываем приоритет процесса. Именно это и делают все диспетчеры задач в т.ч. и «Windows Performance Station». Это приоритизирование распространяется далее на механизмы SMT и всю работу с конвейерами.

image

С появлением SMT ситуация становится чуть сложнее.

Представим конвейер и двух рабочих, у которых есть одна отвёртка и один гаечный ключ на двоих. При этом, каждый из них может оперировать либо только отвёрткой, либо только гаечным ключом. Один конвейер условно делится на две половинки вдоль. SMT позволяет сложить на такой конвейер сразу два числа, одно для работы с отвёрткой, а второе для работы с гаечным ключом, поэтому действия этих рабочих выглядят так:

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

image

Исходя из этого, когда на конвейере находится операция (A и B) с одной стороны и (D и E) с другой стороны — всё отлично, но при распараллеливании цепочки вычислений могут получиться две проблемы:

1. С одной стороны конвейера оказалось действие (A и B) = С, а с другой (D и E) = C,
т.е. нужно записать сначала одно значение C, а потом второе значение C, но не одновременно (конфликт по управлению).

2. С одной стороны конвейера оказалось действие (A и B) = C, а с другой (A и C) = D,
т.е. нужно сначала посчитать C, а потом посчитать D, но не одновременно (конфликт по данным).

Оба конфликта вызывают задержку выполнения инструкций и решаются последовательным выполнением команд. Чтобы уменьшить такие задержки были введены элементы процессора под названием предсказатель переходов и кэш процессора.

Предсказатель переходов, как понятно из названия, осуществляет предсказание :) Предсказывает он вероятность возникновения первой проблемы, когда разные преобразования должны произойти над одним числом.

В свою очередь, кэш процессора, необходим для быстрого решения второй проблемы, когда мы останавливаем решение выражения (A и C) = D и пишем в кэш результат выполнения (A и B) = C, после чего сразу вычисляем (A и C) = D.

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

image

Все эти пляски вокруг угадывания процессором того, как распараллелить текущие операции, приводят к серьёзным потерям энергии и к ощутимым фризам, когда происходит голодание разнотипных задач на ядрах с SMT.

Вообще, стоит держать в уме, что «Intel» разработала «Hyper-Threading» одновременно с созданием своих первых многоядерных процессоров «Xeon» и, по сути, эту технологию можно считать эдаким компромиссом когда ставится двойной конвейер на одно ядро.

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

Примечательно, что на сайте «Intel» в рекламном ролике показывается скорее двухядерность, нежели «Hyper-Threading», тот кто дочитал до этого момента, наверняка уже догадался почему :)

Изображение из видео:

image

Более точное изображение:

image



Какой вывод можно здесь сделать и что улучшить?

Особенность отображения загрузки логических ядер в ОС Windows вводит путаницу об информации реальной загруженности ядер с SMT. Если Вы видите, что два соседних ядера заняты ~50% это может означать две вещи:
1) оба ядра выполняют два параллельных расчёта и загружены на 50% (тут всё ок).
2) оба ядра выполняют один рассчёт попеременно (как если бы два рабочих через такт передавали друг-другу гаечный ключ).
Поэтому, если Вы видите, что все ядра Вашего процессора с SMT загружены на 50% и выше нагрузка не поднимается, скорее всего это значит, что утилизация процессора составляет 100% но он занят однотипной задачей, которую не может разделить для выполнения на SMT!

Вместе с очевидными плюсами, SMT приносит фризы в чувствительные для времени выполнения задачи (воспроизведение видео/музыки или FPS в играх). Именно поэтому, многие геймеры наблюдают падение FPS при включенном SMT/Hyper-Threading.

Как я и написал ранее, приложение «Windows Performance Station» может сортировать блоки, выкладываемые на конвейер, ещё на этапе обработки задач ядром ОС. С помощью приоритетов и разделения процессов по ядрам процессора, можно выкладывать определённые блоки на конвейер в нужном количестве и класть разнотипные блоки для разных виртуальных ядер, чтобы не наступало голодание разнотипных задач. Именно для этой задачи динамического анализа в «Windows Performance Station» мы объединили нейросеть и диспетчер задач. В итоге, нейросеть анализирует задачу и раскладывает её в зависимости от полученных данных по разным правилам, благодаря чему, каждое ядро в паре SMT выполняет разные задачи.

image

Благодаря такому подходу, процессоры с SMT в Windows могут более эффективно работать с многозадачностью и многопоточными процессами. И именно поэтому нас весьма порадовало появление SMT в новых процессорах «AMD Ryzen».

Приложение «Windows Performance Station» бесплатное и не содержит рекламы, его можно скачать с нашего сайта по ссылке в спойлере:
Скачать


Более подробно про Windows Performance Station можно прочитать в моей предыдущей статье
Windows Performance Station или как я учил комп работать эффективно


Большое спасибо всем, кто дочитал до конца.
Поделиться с друзьями
-->

Комментарии (13)


  1. maaGames
    18.07.2017 19:03
    +1

    Тема интересна, поэтому всё прочитал… и ничего не понял. Что делает ваша программа? Это типа SMT профилировщика? Даются рекомендации по переупорядочиванию кода? Всю статью рассказывали про рабочего с гаечным ключом, записывающего числа (без отвёртки число не записать? %)), а самое важное не написали.
    Предпоследний абзац вообще выглядит так, будто это программа для конечного пользователя, чтобы он сам оптимизировал выполнение любой многопоточной программы на своём компьютере, без перекомпиляции.


    1. RollNoir
      18.07.2017 19:19

      Спасибо за замечание, да, здесь вопрос контекста, по сути эта статья является продолжением моей предыдущей статьи про Windows Performance Station.


      1. maaGames
        18.07.2017 19:29

        Почитал сайт. Название статьи неудачное.) Всё-таки это программа для конечного пользователя, который пользуется программами, в которых программисты «накосячили», а не для самих разработчиков.

        Если она действительно даёт такой прирост, как на картинках (пусть хотя бы в некоторых играх), то весьма перспективный продукт именно для геймерской аудитории. Себе я такое не рискну ставить.)))


  1. aamonster
    18.07.2017 19:12

    Э… Кагбэ сравнивать smt-многопоточность имело смысл не с временнОй, а с многоядерностью. Тогда все её проблемы — как на ладони.


    1. RollNoir
      18.07.2017 19:18

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


  1. igordata
    18.07.2017 21:56

    мы объединили нейросеть и диспетчер задач

    И именно поэтому нас весьма порадовало появление SMT в новых процессорах «AMD Ryzen».
    Я не придираюсь. Просто не понял «мы» и «нас» в статье — это про кого? Про SMT я в первый раз узнал из вашей статьи, за что вам спасибо. А про нейросеть в планировщике задач вообще было бы очень интерсно отдельно и в подробностях почитать.


    1. RollNoir
      19.07.2017 10:27

      Подробнее прочитать про «нас» можно в моей предыдущей статье :)

      Windows Performance Station или как я учил комп работать эффективно
      https://habrahabr.ru/post/320110/


  1. kengur8
    19.07.2017 10:27

    Здорово. Нужно больше диспечеров задач для андроеда, например. Ну и не забудьте распарковать ваши ядра, если вы на AMD.


    1. RollNoir
      19.07.2017 10:40

      Для андройда, чтобы управлять задачами корректно, нужен либо рут, либо пересобирать прошивку с встраиванием такого диспетчера. Да и не особо он там и нужен т.к. используется вытесняющая многозадачность. Чаще проблемы с распределением ресурсов на андройде исходят от халтурной сборки ядра прошивки, без качественной отладки на конечном железе :)


  1. g0ld_rush
    19.07.2017 10:28
    +2

    По-моему не верно описано smt. Нет там двух рабочих, есть один рабочий и два конвейера. По конвейеру поступают детали для сборки изделия, например, нужно три детали для сборки одного изделия. Если какая-то деталь не поступает и её не хватает для сборки, то чтобы рабочий не простаивать он переключается на другой конвейер и собирает другие изделия. После поступления нужной детали он переключается обратно.
    Т.е. смысл smt в том чтобы заполнить простои от ожидания данных и команд, которые возникают из-за ошибки предсказания перехода.
    Или это я что-то не понимаю? :)


    1. RollNoir
      19.07.2017 10:35

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


  1. imm
    19.07.2017 18:45

    при запуске эвристика Symantec-а блокирует «wps setup core 64bit.exe», детектит как Heur.AdvML.B

    Discovered:
    May 18, 2016
    Updated:
    June 3, 2016 11:44:25 PM
    Type:
    Trojan, Virus
    Infection Length:
    Varies
    Systems Affected:
    Windows
    Heur.AdvML.B is a heuristic detection designed to generically detect malicious files using advanced machine learning technology. A file detected by this detection name is deemed by Symantec to pose a risk to users and is therefore blocked from accessing the computer.


    я конечно понимаю, что это ложноположительный детект, но выглядит неприятно


    1. RollNoir
      19.07.2017 19:00

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