Используются ли буферы объединения записи для обычной записи в области памяти WB на Intel? - PullRequest
0 голосов
/ 22 ноября 2018

Буферы объединения записи были характерной чертой процессоров Intel, восходящих, по крайней мере, к Pentium 4 и, возможно, раньше.Основная идея заключается в том, что эти буферы размера строки кэша собирают записи в одну и ту же строку кэша, поэтому их можно обрабатывать как единое целое.В качестве примера их влияния на производительность программного обеспечения, если вы не напишите полную строку кэша, вы можете испытать снижение производительности .

Например, в Intel 64 и IA-32 Справочное руководство по оптимизации архитектур раздел «3.6.10 Комбинирование записи» начинается со следующего описания (выделение добавлено):

Комбинация записи (WC) повышает производительность двумя способами:

• В случае пропуска записи в кэш первого уровня, он позволяет нескольким хранилищам в одной и той же строке кэша происходить до того, как эта строка кэша будет считана для владения (RFO) из дальнейшего положения в иерархии кеш / память.Затем читается остальная часть строки, и байты, которые не были записаны, объединяются с неизмененными байтами в возвращаемой строке.

• Объединение записи позволяет собирать и записывать несколько записей далее в иерархии кэша.как единое целое.Это экономит порт и автобусное движение.Экономия трафика особенно важна для предотвращения частичной записи в некэшированную память.

Существует шесть буферов объединения записи (на процессорах Pentium 4 и Intel Xeon с сигнатурой CPUID семейства кодирования 15, кодировка модели 3; имеется 8 буферов объединения записи).Два из этих буферов могут быть записаны на более высокие уровни кэша и освобождены для использования при других ошибках записи.Только четыре буфера объединения записи гарантированно будут доступны для одновременного использования. Комбинирование записи применяется к типу памяти WC;это не относится к типу памяти UC.

В каждом ядре процессора имеется шесть буферов объединения записи в процессорах Intel Core Duo и Intel Core Solo.Процессоры на основе микроархитектуры Intel Core имеют восемь буферов записи в каждом ядре.Начиная с микроархитектуры Intel с кодовым именем Nehalem, доступно 10 буферов для объединения записи.

Буферы объединения записи используются для хранилищ всех типов памяти.Они особенно важны для записи в некэшированную память ...

Мой вопрос заключается в том, применяется ли комбинирование записи к областям памяти WB (это «нормальная» память, которую вы используете в 99,99% случаевв пользовательских программах), когда используются обычные хранилища (это не что иное, как временные хранилища, то есть хранилища, которые вы используете в 99,99% случаев).

Текст, приведенный выше, трудно точно интерпретировать, и посколькуне обновлялся со времен Core Duo.У вас есть часть, которая говорит, что расчесывание записи «применимо к памяти WC, но не к UC», но, конечно, не учитывает все другие типы, такие как WB.Позже вы увидите, что «[WC] особенно важен для записи в не кэшированную память», что явно противоречит «не относится к части UC».

Так используются ли буферы объединения записи на современных чипах Intel для обычных хранилищ в памяти WB?

1 Ответ

0 голосов
/ 23 ноября 2018

Да, свойства объединения и объединения записей LFB поддерживают все типы памяти, кроме типа UC.Вы можете наблюдать их влияние экспериментально, используя следующую программу.В качестве входных данных он принимает два параметра:

  • STORE_COUNT: число 8-байтовых хранилищ для последовательной работы.
  • INCREMENT: шаг между последовательными хранилищами.

Существует 4 различных значения INCREMENT, которые особенно интересны:

  • 64: все хранилища выполняются на уникальных строках кэша.Объединение и объединение записей не будут иметь эффекта.
  • 0: все хранилища находятся в одной строке кэша и в одном и том же месте в этой строке.В этом случае вступает в силу объединение операций записи.
  • 8: Каждые 8 ​​последовательных хранилищ находятся в одной строке кэша, но в разных местах этой строки.В этом случае вступает в силу объединение записи.
  • 4: целевые местоположения последовательных хранилищ перекрываются в одной и той же строке кэша.Некоторые магазины могут пересекать две строки кэша (в зависимости от STORE_COUNT).И объединение записи, и объединение будут иметь эффект.

Существует еще один параметр, ITERATIONS, который используется для многократного повторения одного и того же эксперимента для проведения надежных измерений.Вы можете сохранить его на уровне 1000.

%define ITERATIONS 1000

BITS 64
DEFAULT REL

section .bss
align 64
bufsrc:     resb STORE_COUNT*64

section .text
global _start
_start:  
    mov ecx, ITERATIONS

.loop:
; Flush all the cache lines to make sure that it takes a substantial amount of time to fetch them.
    lea rsi, [bufsrc]
    mov edx, STORE_COUNT
.flush:
    clflush [rsi]
    sfence
    lfence
    add rsi, 64
    sub edx, 1
    jnz .flush

; This is the main loop where the stores are issued sequentially.
    lea rsi, [bufsrc]
    mov edx, STORE_COUNT
.inner:
    mov [rsi], rdx
    sfence ; Prevents potential combining in the store buffer.
    add rsi, INCREMENT
    sub edx, 1
    jnz .inner

; Spend sometime doing nothing so that all the LFBs become free for the next iteration.
    mov edx, 100000
.wait:
    lfence
    sub edx, 1
    jnz .wait

    sub ecx, 1
    jnz .loop

; Exit.    
    xor edi,edi
    mov eax,231
    syscall

Я рекомендую следующую настройку:

  • Отключите все аппаратные средства предварительной выборки, используя sudo wrmsr -a 0x1A4 0xf.Это гарантирует, что они не будут мешать (или иметь минимальные помехи) экспериментам.
  • Установите частоту ЦП на максимум.Это увеличивает вероятность того, что основной цикл будет полностью выполнен до того, как первая строка кэша достигнет L1, и приведет к освобождению LFB.
  • Отключите гиперпоточность, поскольку LFB совместно используются (по крайней мере, после Sandy Bridge, но нена всех микроархитектурах).

Счетчик производительности L1D_PEND_MISS.FB_FULL позволяет нам фиксировать эффект объединения записей в отношении того, как он влияет на доступность LFB.Это поддерживается на Intel Core и позже.Он описывается следующим образом:

Количество раз, когда запросу требовалась запись FB (Fill Buffer), но для нее не было доступной записи.Запрос включает в себя кэшируемые / не кэшируемые требования, которые являются инструкциями загрузки, сохранения или предварительной выборки SW.

Сначала запустите код без внутреннего цикла и убедитесь, что L1D_PEND_MISS.FB_FULL равен нулю, что означает цикл очисткине влияет на количество событий.

На следующем рисунке показано STORE_COUNT против общего числа L1D_PEND_MISS.FB_FULL, разделенного на ITERATIONS.

enter image description here

Мы можем наблюдать следующее:

  • Ясно, что существует ровно 10 LFB.
  • Когда возможно объединение или объединение записи, L1D_PEND_MISS.FB_FULL равно нулю для любого числаstore.
  • Когда длина шага составляет 64 байта, L1D_PEND_MISS.FB_FULL больше нуля, когда количество хранилищ больше 10.

Позже у вас есть это "[WC] особенно важен для записи в некэшированную память », что явно противоречит« не относится к части UC ».

И WC, и UC классифицируются как не кэшируемые.Таким образом, вы можете соединить два оператора, чтобы сделать вывод, что WC особенно важен для записи в память WC.

См. Также: Где находится объединяющий запись буфер?x86 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...