23.01.2021

Отгадка

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

Между тем, есть очень простой способ проверить, что является причиной – взять, да и отключить HyperThreading. Что я собственно и сделал на AMD Ryzen 3600.
Отключить-то я его отключил, а вот назад он включаться не захотел, да. На материнке ASRock B450M Steel legend. Давненько я с такими глюками не сталкивался.
Погуглил. Простые советы не помогли, оставался последний способ - сбросить BIOS. И тут меня перемкнуло, и я решил сбросить BIOS жестко, перемкнув соответствующие контакты на материнской плате. Перемычки под рукой не оказалось, поэтому замыкал контакты имеющимися под руками металлическими предметами, строго по инструкции, на 5 секунд.
Несколько попыток не помогли
– BIOS не сбрасывался. Я уж чуть было не разобрал полкомпьютера, пытаясь добраться до батарейки CMOS-памяти, да вовремя остановился. Достаточно оказалось сбросить BIOS программно.😅

Итак, результаты. Все же виной падению производительности оказалась нехватка памяти. Потоки запускались не абсолютно синхронно, а завершались очень быстро, поэтому замерялось не столько время выполнения, сколько время реакции планировщика OS.

Посмотрим графики. "12/12" – 12 потоков на 12 виртуальных ядрах из 6 физических; "6/6" 6 потоков на 6 физических ядрах; "6/12" 6 потоков на 12 виртуальных ядрах.
Кстати, там есть любопытный момент.



Сначала банальность: в однопоточном режиме HyperThreading никак не влияет на производительность.

В многопоточном HyperThreading безусловно хорошо повышает общую производительность, пока решаемая задач целиком попадает в кэш L3.
Но при этом производительность каждого потока оказывается немного меньше, чем при отключенном HyperThreading. Насколько меньше? Примерно на 4-5% для каждого потока, и до 30% на шести потоках в целом (по одному потоку на физическое ядро).
Это хорошо видно на графиках "6/62 и "6/12". Последний проигрывает первому на всех размерностях.

О чем это говорит? О том, что без HyperThreading отзывчивость приложения может быть лучше. Потенциально до 30%, но гораздо ближе к практике  5% в силу параллельности решения задачи.
Сомневаюсь, что эти 5% заметит даже самый требовательный игрок, но в каких-то вариантах эти 5% могут все же иметь значение.

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

Впрочем, эти проблемы потенциально могла бы решить правильная работа планировщика. Например, на одно физическое ядро помещать один полностью загруженный, "тяжелый" поток и в довесок к нему несколько "легких" потоков.
Но, судя по всему, на текущий момент планировщик Windows 10 так не умеет.

09.01.2021

Результаты вещественного теста

Ну вот, вроде бы оттестировал все процессоры на решение систем линейных уравнений методом Гаусса-Жордана, самое время привести результаты.

Здесь я не стал приводить результаты AMD FX-4350, так как он является базой для сравнения и его производительность принимается за единицу.
Как видно, рост
ускорения на вещественных операциях  за несколько лет составил даже больше, чем в два раза.
Безусловный лидер среди оттестированных – это AMD Ryzen 5 3600, он уверенно обгоняет оттестированные процессоры Intel поколения SkyLake.

 
Самое интересное, что и в однопоточном режиме, в отличие от целочисленных операций (см. предыдущий пост), рост производительности за несколько лет весьма значителен: 60% скалярной производительности и более 150% векторной.
Складывается впечатление, что основное ускорение в будущем в однопоточной производительности будет именно на вещественных операциях, так как, похоже, потенциал серьезного ускорения целочисленных операций на текущий момент полностью исчерпан. Хорошо, если будет один-два процента за год.
Впрочем, посмотрим, что даст в отношении целочисленных операций M1 от Apple. Вдруг случится неожиданный сюрприз. 😀

 
При одновременной работе нескольких потоков тупо всё решает их количество. Так что "щедрый" на ядра подход AMD, похоже, себя оправдывает.

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

 
Как видно, процессоры делятся на две группы: у одной серьезный провал на минимальном размере, у некоторых  процессоров Intel получается даже медленнее, чем решать на одном ядре.
У второй же группы провал отсутствует или минимален.

В первой группе все процессоры, поддерживающие HyperThreading, кроме Intel i3-3227U. Этот процессор, хоть и имеет данную технологии, не демонстрирует просадку производительности на минимальном размере.

Как одну из причин такого странного поведения я изначально рассматривал нехватку ОЗУ, что при переходе на многопоточный тест, из-за высокой производительности процессоров, не давало возможности сгенерировать достаточное количество систем для теста, что снижало точность тестирования.
Так, Intel i7-6700HQ имеет 12 ГиБ ОЗУ, i5-8300H вообще 8, а Ryzen 5 3600 16, что с учетом его производительности может быть недостаточно.

Но с другой стороны, на типе double провал существенно меньше, хотя производительность уменьшается незначительно (буквально на несколько процентов), в то время как памяти требуется в два раза больше. Если бы дело было в нехватке ОЗУ, это должно было бы привести к еще большему провалу, но это не так.


Видимо, все же дело в HyperThreading? Надо подумать, как можно было бы это легко проверить.

Да, еще: Scalar SSE всегда быстрее FPU. Ну, почти всегда. На трех переменных у Intel таки быстрее FPU. Но такое преимущество только на простых, арифметических операциях.
Сохранится ли оно на более сложных, например, тригонометрических, степенных или логарифмических операциях? Данный вопрос требует отдельного исследования, но у меня пока ни одной интересной задачки на эту тему не вырисовывается.
Ну и жертвуется точность, конечно. В редких случаях это может быть важно. Впрочем, пока что FPU присутствует на всех современных процессорах, так что при необходимости всегда можно его использовать.