Упорядочивание вневременных хранилищ Intel в одну и ту же строку кэша
Достигают ли невременные хранилища (например, movnti) в той же строке кэша тем же потоком в память в программном порядке? Так что для системы с NVRAM (например, процессора Intel Cascade Lake с Intel 3D XPoint NVRAM) в случае сбоя отсутствие переупорядочения гарантирует преобладание префикса записи в одну и ту же строку кэша?
1 ответ
Предполагая, что разрешенный тип памяти невременных хранилищ - это WC (или WC+), о чем, я думаю, вы спрашиваете, ответ в основном не для процессоров Intel и AMD.
Для процессоров Intel определенные операторы из раздела 11.3.1 Intel SDM V2 определяют поведение записи с комбинированием записи на микроархитектурах, по крайней мере, с одним буфером WC.
Протокол удаления буферов WC зависит от реализации и не должен использоваться программным обеспечением для согласованности системной памяти.
Это общее утверждение, в котором говорится, что причины выселения WC и транзакций, выполняемых для выселения буфера WC, зависят от реализации. Но в разных местах инструкции есть конкретные утверждения.
Аналогичным образом [как в P6] для более поздних процессоров, начиная с процессоров, основанных на микроархитектурах Intel NetBurst, полный буфер WC всегда будет распространяться как единая пакетная транзакция с использованием любого порядка фрагментов внутри транзакции.
Если все байты в одном буфере WC действительны, что означает, что каждый байт был записан по крайней мере один раз с момента выделения буфера, при удалении буфера по любой причине вся строка кэша в буфере удаляется с помощью одной транзакции . Если целью буфера является контроллер памяти, который является первым блоком в домене сохранения на CLX, либо все байты транзакции сохраняются, либо ни один из байтов. Это означает, что программный порядок команд записи, записанных в эту строку, сохраняется. Порядок между этими конкретными записями и другими записями будет обсуждаться позже.
Часть «использование любого порядка фрагментов в транзакции» в этом контексте не важна с точки зрения программного обеспечения, когда целью транзакции является контроллер памяти, но важна для других целей.
Intel указала, что размер блока должен быть выровнен по 8 байтов для всех микроархитектур. Этот размер блока применяется только к ядру и межсоединениям без ядра, но не сверх того, где реализованы другие протоколы. Но что касается записи, нацеленной на IMC, постоянная атомарность гарантируется на уровне детализации транзакции, которая может содержать от 1 до 64 байтов (размер буфера WC на всех современных процессорах Intel и AMD составляет 64 байта), в зависимости от распределение действительных байтов в том же буфере WC в то время, когда буфер был удален, и в зависимости от точного протокола удаления. На процессорах Intel транзакция гарантированно будет содержать все 64 действительных байта в случае полного вытеснения буфера WC.
В руководстве AMD только сказано, что полное вытеснение буфера WC может быть выполнено как одна транзакция.
Следующая цитата определяет гарантии упорядочения в случае частичного вытеснения буфера WC (где не все байты помечены как действительные в буфере) и упорядочение между записями в разных буферах WC. Это касается процессоров Intel и AMD.
Как только началось вытеснение буфера WC, данные подвергаются семантике слабого упорядочивания его определения.
Остальная часть параграфа переходит к дальнейшему развитию. Частичный буфер WC может быть исключен с помощью одной или нескольких транзакций, и между этими транзакциями нет гарантий упорядочения. Как только инструкция записи фиксируется в буфере WC, ее расположение в порядке программы полностью теряется. Если целью этих транзакций является IMC, постоянная атомарность обеспечивается только на уровне детализации одной транзакции. Вот как запись с эффективным типом памяти WC может сохраняться без сохранения более ранней записи WC. Если разные инструкции записи частично перекрываются в одном и том же буфере WC, инструкция записи может стать частично устойчивой вне очереди по сравнению с другими записями в том же буфере WC. Операция записи в буфер WC, которая пересекает границу блока, не имеет архитектурной гарантии атомарности,если буфер не будет полностью заполнен после объединения записи (на процессорах Intel).
Буферы WC могут быть исключены в порядке, отличном от порядка выделения буфера. Инструкции по ограждению нельзя использовать для выборочной промывки буферов WC. Однако запись любого типа, отличного от WC, где есть перекрывающийся выделенный буфер WC, вызывает, в частности, удаление этого буфера перед выполнением записи. Нагрузка, которая попадает в WCB, может не привести к удалению буфера.
Транзакции, которые происходят для очистки одного буфера WC, не обязательно упорядочиваются по отношению к транзакциям, которые происходят для очистки другого буфера WC в том же физическом ядре. Даже если логика удаления WC реализована таким образом, что буферы WC удаляются последовательно, что вполне вероятно, нет гарантии, что транзакции из разных буферов WC не будут чередоваться за пределами физического основного домена.
Все это означает, что постоянное упорядочение не гарантируется между разными фрагментами одного и того же буфера WC и разных буферов WC, даже в одном и том же физическом ядре.
События, вызывающие вытеснение буфера WC, могут различаться между поставщиками и процессорами одного и того же поставщика. Некоторые события являются архитектурными (задокументированы в руководствах для разработчиков), в то время как другие зависят от реализации (задокументированы в таблицах данных). Инструкции по сериализации хранилища являются примером синхронного события, которое действительно гарантирует очистку всех буферов WC в одном и том же логическом ядре. Аппаратное прерывание, доставленное логическому ядру, является примером асинхронного события, которое также вызывает удаление всех его буферов WC. Более того, количество буферов WC на физическое или логическое ядро зависит от реализации и может быть нулевым. Размер буфера WC также зависит от реализации и с архитектурной точки зрения может быть больше или меньше размера строки кэша L1D.Кроме того, буферы WC могут использоваться для различных целей, кроме объединения записей WC, в зависимости от микроархитектуры.
Следовательно, даже если вы пишете только полные буферы WC, невозможно гарантировать, что буфер WC будет вытеснен только тогда, когда он станет заполнен с целью сохранения атомарности, даже на процессорах Intel, где полное вытеснение WC выполняется с помощью одной транзакции. .
Вместо выполнения нескольких команд записи WC вы можете использовать, что гарантирует атомарность. не выделяет буфер WC и направляется непосредственно к месту назначения, но он может быть объединен с уже выделенным буфером WC, и в этом случае буфер удаляется сразу после объединения существующего содержимого буфера и. В любом случае операция записи всегда выполняется как одна транзакция. Обратите внимание, что операнд целевой памяти должен быть выровнен по 64-байтовой границе. Подобно традиционному магазину туалетов, в любом другом магазине, кроме UC, порядок его слабо упорядочен. поддерживается на TNT, TGL и SPR.
Запись WC/WC+ не упорядочивается по отношению к другим операциям записи в память любого типа, кроме UC на процессорах Intel и AMD. Кроме того, отдельная инструкция записи (или инструкция, которая записывает в адресное пространство физической памяти) любого типа памяти, пересекающего выровненную 8-байтовую границу, сама по себе не гарантирует атомарную гранулярность, превышающую выровненные 8-байтовые. Это включает в себя постоянную атомарность. Единственные исключения:
MOVDIR64B
,
ENQCMD
, а также
ENQCMDS
. Последние два актуальны при записи MMIO. Выровненные 64-байтовые хранилища AVX-512, вероятно, будут постоянно атомарными, но это не гарантируется архитектурой, и на это не следует полагаться.