Для оценки эффективности использования процессоров с технологией Hyper-Threading для решения тех или иных классов задач проведен ряд экспериментов с тестовым сервером с 2-мя физическими процессорами Intel Xeon с технологией Hyper Threading (2 логических процессора в каждом). Для экспериментов использовались 3 простейшие низкоуровневые программы собственноручного изготовления: одна реализует большие циклы целочисленных команд, вторая - большие циклы операций над вещественными числами, третья - циклы поисков 32-битного элемента в большом массиве 32-битных элементов. Все программы разработаны таким образом, что они выполняются за приблизительно одинаковое время на однопроцессорных системах. Также использовались встроенные средства ОС MS Windows 2000 Server. Для оценки времени выполнения программ и загрузки процессоров использовалась стандартная оснастка Performance операционной системы Windows 2000.
Конфигурация сервера:
ОС: MS Windows 2000 Advanced Server
1. Запускаем три раза с небольшими паузами процесс целочисленных операций:
2. Запускаем три раза с небольшими паузами процесс вещественных операций:
Как видим, помимо того, что при создании процесса ему может быть назначен любой из доступных логических процессоров, возможно, автоматическое переназначение исполнительного логического процессора также и во время жизни процесса. Логические процессоры внутри физического процессора не привязаны к конкретным видам исполнительных устройств (целочисленный блок, блок операций с плавающей запятой и т.д.).
Также видим то, что 0-й логический процессор (красный график) назначается крайне редко. Возможно, он системой MS Windows зарезервирован для своих нужд (служб и системных процессов). Это легко проверить.
3. Возьмем какую-нибудь большую папку, например, дистрибутив Windows 2000 и компрессируем ее средствами Windows. Повторим опыт три раза с небольшими паузами и убедимся в верности предположения:
Примечание. Необходимо заметить то, что MS Windows не всегда использует для своих нужд один и тот же выделенный логический процессор.
4. Проведем серию экспериментов с двумя процессами с целочисленными операциями.
Проведем простой эксперимент: разрешим для тестовых процессов использовать только любой один логический, например 2-й, и запустим два целочисленных процесса одновременно, а потом ради сравнения по очереди сначала один потом второй:
Как видим, все вполне логично: два параллельно запущенных процесса работали по времени столько же, сколько сумма времен каждого в отдельности.
Проведем следующий хитрый эксперимент: разрешим для наших тестовых процессов использовать только 2-й и 3-й логические процессоры (делается это в Task Manager, используя настройку Affinity для тестовых процессов) и запустим параллельно два процесса с целочисленными операциями. Далее, после небольшой паузы, разрешим использовать только 1-й и 3-й процессор и снова запустим два процесса с целочисленными операциями:
Как видим, 2-й и 3-й логические процессоры выполняют целочисленные операции параллельно, а 1-й и 3-й - последовательно, чередуя операции с высокой скоростью, поэтому графики для 1-го и 3-го процессора выглядят как параллельные. Время выполнения на 1-м и 3-м в 4 раза больше, чем на 2-м и 3-м и даже в 2 раза больше, чем, если бы процессы выполнялись вообще последовательно на одном логическом процессоре.
Проведем аналогично еще один хитрый эксперимент: разрешим для наших тестовых процессов использовать только 0-й и 1-й логические процессоры и запустим параллельно два процесса с целочисленными операциями. Далее, после паузы, разрешим использовать только 0-й и 2-й процессор и снова запустим два процесса с целочисленными операциями:
Как видим, 0-й и 1-й логические процессоры выполняют целочисленные операции параллельно, а 0-й и 2-й - последовательно, чередуя операции с высокой скоростью, поэтому графики для 0-го и 2-го процессора выглядят как параллельные. Время выполнения на 0-м и 2-м в 4 раза больше, чем на 0-м и 1-м и даже в 2 раза больше, чем, если бы процессы выполнялись вообще последовательно на одном логическом процессоре.
Проведем аналогично еще один хитрый эксперимент: разрешим для наших тестовых процессов использовать только 0-й и 3-й логические процессоры и запустим параллельно два процесса с целочисленными операциями. Далее, после паузы, разрешим использовать только 1-й и 2-й процессор и снова запустим два процесса с целочисленными операциями:
Как видим, 0-й и 3-й логические процессоры выполняют целочисленные операции параллельно, 1-й и 2-й логические процессоры - тоже все делают параллельно.
Запустим теперь два целочисленных процесса на всех 4-х доступных логических серверах:
Результат удручает: время выполнения на 4-х логических процессорах такое же, как если бы оба процесса выполнялись бы на одном логическом.
Очевидно, 0-й и 2-й логический процессор представляют 0-й физический процессор, 1-й и 3-й логические процессоры - 1-й физический процессор.
При выполнении процессов на логических процессорах разных физических процессоров процессы выполняются полностью параллельно. При попытке выполнения процессов с целочисленными операциями на разных логических процессорах, но одного и того же физического процессора, параллелизм не только отсутствует, но и имеется замедление в 2 раза по сравнению с тем, если бы процессы выполнялись на одном единственном процессоре.
При выполнении 2-х целочисленных процессов на всех доступных 4-х логических процессорах 2-х физических, время выполнения такое же, как и на одном единственном логическом процессоре. Видимо, Windows 2000 ничего не знает о физических процессорах и назначает выполнение на свое усмотрение на любой доступный логический, и если оказывается, что два процесса попали на два логических процессора одного физического, то, судя по экспериментам 4.3 и 4.4, отсутствие какого-либо ускорения или появление даже замедления неудивительно.
5. Проведем аналогичные эксперименты с двумя процессами с вещественными числами:
Проведем простой эксперимент: разрешим для тестовых процессов использовать только любой один логический, например 2-й, и запустим два вещественных процесса одновременно, а потом ради сравнения по очереди сначала один потом второй:
Как видим, вполне логично: два параллельно запущенных процесса работали по времени столько же, сколько сумма времен каждого в отдельности. Проведем следующий хитрый эксперимент: разрешим для наших тестовых процессов использовать только 2-й и 3-й логические процессоры (делается это в Task Manager, используя настройку Affinity для тестовых процессов) и запустим параллельно два процесса с вещественными операциями. Далее, после небольшой паузы, разрешим использовать только 1-й и 3-й процессор и снова запустим два процесса с вещественными операциями:
Удивительный результат! В отличие от целочисленного случая и на 2-м + 3-м и на 1-м + 3-м логических процессорах вещественные процессы выполнились параллельно. А мы помним о том, что 1-й и 3-й логический процессоры принадлежат одному физическому.
Проведем аналогично еще один хитрый эксперимент: разрешим для наших тестовых процессов использовать только 0-й и 1-й логические процессоры и запустим параллельно два процесса с вещественными операциями. Далее, после паузы, разрешим использовать только 0-й и 2-й процессор и снова запустим два процесса с вещественными операциями:
Удивительный результат! В отличие от целочисленного случая и на 0-м + 1-м и на 0-м + 2-м логических процессорах вещественные процессы выполнились параллельно. А мы помним о том, что 0-й и 2-й логический процессоры принадлежат одному физическому.
Проведем аналогично еще один хитрый эксперимент: разрешим для наших тестовых процессов использовать только 0-й и 3-й логические процессоры и запустим параллельно два процесса с вещественными операциями. Далее, после паузы, разрешим использовать только 1-й и 2-й процессор и снова запустим два процесса с вещественными операциями:
Как видим, 0-й и 3-й логические процессоры выполняют вещественные операции параллельно, 1-й и 2-й логические процессоры - тоже все делают параллельно.
Запустим теперь два вещественных процесса на всех 4-х доступных логических серверах:
Как и ожидалось, оба вещественных процесса отработали параллельно (в отличие от 2-х целочисленных в эксперименте 4.5).
После проведенных экспериментов 4 и 5 можно сделать вывод о том, что 2 логических процессора внутри одного физического по технологии Hyper Threading, полностью эффективны для параллельных процессов с вещественными операциями и крайне невыгодны (в 2 раза хуже даже по сравнению с однопроцессорным вариантом) при параллельных процессах с целочисленными операциями. Можно предположить, что в HT процессоре один целочисленный блок и как минимум два блока вещественных операций. Но почему происходит ухудшение в 2 раза по сравнению с обычным однопроцессорным вариантом, при использовании 2-х логических процессоров внутри одного физического HT процессора для 2-х параллельных целочисленных процессов, остается неясным.
6. Проведем серию экспериментов с двумя различными процессами: один с целочисленными операциями и один с вещественными операциями.
Проведем простой эксперимент: разрешим для тестовых процессов использовать только любой один логический, например 2-й, и запустим два различных тестовых процесса одновременно, а потом ради сравнения по очереди сначала один потом второй:
Как видим, все вполне логично: два параллельно запущенных процесса работали по времени столько же, сколько сумма времен каждого в отдельности.
Проведем следующий хитрый эксперимент: разрешим для наших тестовых процессов использовать только 2-й и 3-й логические процессоры (делается это в Task Manager, используя настройку Affinity для тестовых процессов) и запустим сначала целочисленный, а затем вещественный процесс. Далее, после паузы, разрешим использовать только 1-й и 3-й процессор и снова запустим сначала целочисленный, а затем вещественный процесс:
На 2-м и 3-м логических процессорах оба процесса отработали параллельно, на 1-м и 3-м картина удивительная: несмотря на то, что целочисленный процесс был запущен раньше, позже запущенный вещественный процесс прервал работу целочисленного процесса и пока не завершился вещественный, целочисленный процесс вообще не выполнялся.
Проведем следующий хитрый эксперимент: разрешим для наших тестовых процессов использовать только 0-й и 1-й логические процессоры и запустим сначала целочисленный, а затем вещественный процесс. Далее, после паузы, разрешим использовать только 0-й и 2-й процессор и снова запустим сначала целочисленный, а затем вещественный процесс:
На 0-м и 1-м логических процессорах оба процесса отработали параллельно, на 0-м и 2-м картина удивительная: несмотря на то, что целочисленный процесс был запущен раньше, позже запущенный вещественный процесс прервал работу целочисленного процесса и пока не завершился вещественный, целочисленный процесс вообще не выполнялся.
Проведем аналогично еще один хитрый эксперимент: разрешим для наших тестовых процессов использовать только 0-й и 3-й логические процессоры и запустим сначала целочисленный, а затем вещественный процесс. Далее, после паузы, разрешим использовать только 1-й и 2-й процессор и снова запустим сначала целочисленный, а затем вещественный процесс:
Как видим, 0-й и 3-й логические процессоры выполнили тестовые процессы параллельно, 1-й и 2-й логические процессоры - тоже все делают параллельно. Запустим теперь один вещественный и один целочисленный процесс на всех 4-х логических серверах:
Что же, результат, конечно же, не лучший, но, тем не менее, 1 целочисленный и 1 вещественный процесс на всех доступных 4-х логических процессорах выполняются быстрее (примерно в 4/3 раза) чем на два целочисленных процесса, но медленнее (примерно в 1.5 раза) чем 2 вещественных процесса.
Здесь можно сделать только один вывод: для HT процессора вещественные операции имеют приоритет перед целочисленными, если один логический процессор занят вещественными операциями, то на втором логическом процессоре выполнение целочисленных операций практически невозможно вообще.
7. Проведем серию экспериментов с двумя процессами многократного поиска заданного 32-битного элемента в массиве (области памяти).
Проведем простой эксперимент: разрешим для тестовых процессов использовать только любой один логический, например 2-й, и запустим два поисковых процесса одновременно, а потом ради сравнения по очереди сначала один потом второй:
Как видим, все вполне логично: два параллельно запущенных процесса работали по времени столько же, сколько сумма времен каждого в отдельности.
Проведем следующий хитрый эксперимент: разрешим для наших тестовых процессов использовать только 2-й и 3-й логические процессоры (делается это в Task Manager, используя настройку Affinity для тестовых процессов) и запустим параллельно два поисковых процесса. Далее, после небольшой паузы, разрешим использовать только 1-й и 3-й процессор и снова запустим два поисковых:
Как видим, 2-й и 3-й логические процессоры выполняют поисковые операции параллельно, а 1-й и 3-й - последовательно, чередуя операции с высокой скоростью, поэтому графики для 1-го и 3-го процессора выглядят как параллельные. Ну, по крайней мере, последовательное выполнение - это не 2-х кратное ухудшение по сравнение вообще с однопроцессорным вариантом, как это было для целочисленных операций.
Проведем следующий хитрый эксперимент: разрешим для наших тестовых процессов использовать только 0-й и 1-й логические процессоры (делается это в Task Manager, используя настройку Affinity для тестовых процессов) и запустим параллельно два поисковых процесса. Далее, после небольшой паузы, разрешим использовать только 0-й и 2-й процессор и снова запустим два поисковых:
Как видим, 0-й и 1-й логические процессоры выполняют поисковые операции параллельно, а 0-й и 2-й - последовательно, чередуя операции с высокой скоростью, поэтому графики для 1-го и 3-го процессора выглядят как параллельные. Ну, по крайней мере, последовательное выполнение - это не 2-х кратное ухудшение по сравнение вообще с однопроцессорным вариантом, как это было для целочисленных операций.
Проведем аналогично еще один хитрый эксперимент: разрешим для наших тестовых процессов использовать только 0-й и 3-й логические процессоры и запустим параллельно два процесса поисковыми операциями. Далее, после небольшой паузы, разрешим использовать только 1-й и 2-й процессор и снова запустим два процесса с поисковыми операциями:
Как видим, 0-й и 3-й логические процессоры выполняют целочисленные операции параллельно, 1-й и 2-й логические процессоры - тоже все делают параллельно.
Запустим теперь два поисковых процесса на всех 4-х доступных логических серверах:
Результат удручает: время выполнения на 4-х логических процессорах такое же, как если бы оба процесса выполнялись бы на одном логическом.
8. Проведем последний эксперимент: запустим параллельно 4 поисковых процессов на всех 4-х доступных логических процессорах.
Результат: время выполнения на 4-х логических процессорах 4-х процессов почти такое же, как выполнения 2-процессов на 4-х процессорах. Очевидно, в эксперименте из 4 процессов одна пара процессов выполнялась на 0-м и 2-м, а другая пара - на 1-м и 3-м логических процессорах. Сами пары выполнялись параллельно, а внутри каждой пары процессы выполнялись последовательно. Очевидно, что параллелизм для операций поиска проявляется только на физических разных процессорах. 2 логических процессора внутри одного физически не могут параллельно выполнять процессы с операциями поиска.
Здесь можно сделать следующий вывод: операции поиска вообще не распараллеливаются между логическими процессорами одного физического HT-процессора. И, по крайней мере, если два процесса работают на двух логических процессорах одного физического, они просто выполняются последовательно, а не дают 2-х кратное ухудшения по сравнению с однопроцессорным вариантом, как это было для целочисленных операций.
Необходимо добиваться того, чтобы на логические процессоры одного и того же физического попадали только процессы с вещественными операциями, причем чтобы вещественный процесс не попадал на логический процессор того физического процессора, на втором логическом процессоре которого работает какой-либо важный процесс, но не связанный с вещественными операциями. Ни в коем случае не допускать попадание двух целочисленных процессов на логические процессоры одного физического. ОС Windows 2000 такая мудрость не под силу, а значит либо вообще при данной ОС отказаться от Hyper Threading, либо управлять Affinity вручную (или своими программными средствами).
обсудить | все отзывы (18) | |
[23416; 35; 6.74] |
|
|