С помощью 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.