С помощью Hyper Threading потоки одного физического ядра обмениваются через какой уровень кеша L1/L2/L3?
Позволяет ли Hyper Threading использовать L1-cache для обмена данными между двумя потоками, которые выполняются одновременно на одном физическом ядре, но в двух виртуальных ядрах?
При условии, что оба относятся к одному и тому же процессу, то есть в том же адресном пространстве.
Page 85 (2-55) - Справочное руководство по оптимизации архитектур Intel® 64 и IA-32: http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf
2.5.9 Поддержка технологии Hyper-Threading в микроархитектуре Intel® Название кода Nehalem
...
Более глубокая буферизация и расширенные политики доступа к ресурсам/раздела:
-
Реплицированный ресурс для работы с HT: состояние регистрации, переименованный буфер буфера возврата, ITLB большой страницы.
-
Разделенные ресурсы для работы с HT: буферы нагрузки, буферы хранения, буферы повторного заказа, ITLB с небольшими страницами статически распределяются между двумя логическими процессорами.
-
Конкурентоспособный ресурс во время работы HT: станция резервирования, иерархия кэша, буферы заполнения, как DTLB0, так и STLB.
-
Чередование во время работы в режиме HT: передняя операция обычно чередуется между двумя логическими процессорами, чтобы обеспечить справедливость.
-
HT неизвестные ресурсы: исполнительные блоки.
Ответы
Ответ 1
Руководство по оптимизации программного обеспечения Intel Architecture содержит краткое описание того, как ресурсы процессора распределяются между потоками HT на ядре в главе 2.3.9. Документировано для архитектуры Nehalem, становясь устаревшим, но, скорее всего, все еще актуальным для текущих, поскольку разделение логически непротиворечиво:
-
Дублируется для каждого HT-потока: регистры, буфер обратного потока, ITLB на большой странице
-
Статически выделяется для каждого HT-потока: буферы загрузки, хранения и повторного заказа, ITLB с маленькими страницами
-
Конкурентоспособно делится между потоками HT: станцией резервирования, кэшами, буферами заполнения, DTLB0 и STLB.
Ваш вопрос соответствует 3-й пуле. В самом конкретном случае каждого HT-потока, выполняющего код из одного и того же процесса, немного из-за аварии, вы обычно можете ожидать, что L1 и L2 будут содержать данные, полученные одним потоком HT, которые могут быть полезны для другого. Имейте в виду, что единица хранения в кэшах - это кеш-строка, 64 байта. На всякий случай: это не совсем повод для подхода к планированию потоков, который способствует тому, чтобы два HT-потока выполнялись на одном ядре, предполагая, что ваша ОС поддержит это. HT-поток обычно работает довольно медленно, чем поток, который получает ядро для себя. 30% - это обычное число, связанное с YMMV.