С Hyper Threading потоки одного физического ядра обмениваются через какой уровень кеша L1/L2/L3?
Позволяет ли Hyper Threading использовать кэш L1 для обмена данными между двумя потоками, которые выполняются одновременно на одном физическом ядре, но на двух виртуальных ядрах?
При условии, что оба принадлежат одному и тому же процессу, то есть в одном и том же адресном пространстве.
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 содержит краткое описание того, как ресурсы процессора распределяются между потоками HT на ядре в главе 2.3.9. Документально подтверждено для архитектуры Nehalem, она устарела, но, скорее всего, будет актуальна для текущих, так как разделение логически непротиворечиво:
Дублируется для каждого потока HT: регистры, буфер стека возврата, ITLB большой страницы
Статически распределяется для каждого потока HT: буферы загрузки, хранения и переупорядочения, ITLB на маленькой странице
Конкурентоспособно распределяется между потоками HT: станцией резервирования, кэшами, буферами заполнения, DTLB0 и STLB.
Ваш вопрос соответствует 3-й пуле. В очень специфическом случае, когда каждый HT-поток выполняет код из одного и того же процесса, что-то вроде аварии, вы обычно можете ожидать, что L1 и L2 будут содержать данные, полученные одним HT-потоком, которые могут быть полезны для другого. Имейте в виду, что единица хранения в кэше - это строка кэша, 64 байта. На всякий случай: это не является хорошей причиной для использования подхода планирования потоков, который способствует выполнению двух потоков HT на одном и том же ядре, при условии, что ваша ОС будет поддерживать это. HT-поток обычно работает немного медленнее, чем поток, который получает ядро к себе. 30% - это обычное число, о котором говорится, YMMV.