Информация об изменениях

Сообщение Re[4]: Что именно делают /volatile:ms и /volatile:iso на x86 от 06.01.2022 11:37

Изменено 06.01.2022 11:40 netch80

Re[4]: Что именно делают /volatile:ms и /volatile:iso на x86 ?
Здравствуйте, Максим, Вы писали:

AG>>Нет. Для store buffer лишь гарантируется, что операции в нём не переупорядочиваются.


М>Да, но тогда получается что, время когда второй поток увидит эти изменения никому неизвестно. Если логика программы завязана на данной переменной, то возможны сюрпризы, Разве не так?


В схожем обсуждении один коллега утверждал (ссылку не нахожу), что есть гарантия выдачи всех результатов команд в память-и-кэши в течение 10 наносекунд.
И в общем случае процессор заинтересован скинуть результаты выполнения команд как можно быстрее, потому что store buffer не резиновый и нефиг тянуть со сбросом его результатов.

Поэтому, если, например, там какие-то счётчики, которые потом снимаются раз в секунду, то ускорение сброса этих значений всем по барабану.

А вот правило, что каждая операция записи имеет release semantics, приводит к тому, что при активной работе задержки с публикацией не будет совсем. Ну а где надо — можно и через sfence подпереть костыликом.

Мааленькая поправка — Intel сейчас дословно говорит

Writes to memory are not reordered with other writes, with the following exceptions:

— streaming stores (writes) executed with the non-temporal move instructions (MOVNTI, MOVNTQ, MOVNTDQ, MOVNTPS, and MOVNTPD); and
— string operations (see Section 8.2.4.1).


Вот с последним могут быть хитрые проблемы (вот заложились вы что memset это запись, а оно сделано через STOS...)
Re[4]: Что именно делают /volatile:ms и /volatile:iso на x86
Здравствуйте, Максим, Вы писали:

AG>>Нет. Для store buffer лишь гарантируется, что операции в нём не переупорядочиваются.


М>Да, но тогда получается что, время когда второй поток увидит эти изменения никому неизвестно. Если логика программы завязана на данной переменной, то возможны сюрпризы, Разве не так?


В схожем обсуждении один коллега утверждал (ссылку не нахожу), что есть гарантия выдачи всех результатов команд в память-и-кэши в течение 10 наносекунд.
И в общем случае процессор заинтересован скинуть результаты выполнения команд как можно быстрее, потому что store buffer не резиновый и нефиг тянуть со сбросом его результатов.

Поэтому, если, например, там какие-то счётчики, которые потом снимаются раз в секунду, то ускорение сброса этих значений всем по барабану.

А вот правило, что каждая операция записи имеет release semantics, приводит к тому, что при активной работе задержки с публикацией не будет совсем. Ну а где надо — можно и через sfence подпереть костыликом.

Мааленькая поправка — Intel сейчас дословно говорит

Writes to memory are not reordered with other writes, with the following exceptions:

— streaming stores (writes) executed with the non-temporal move instructions (MOVNTI, MOVNTQ, MOVNTDQ, MOVNTPS, and MOVNTPD); and
— string operations (see Section 8.2.4.1).


Про string operations — там порядок может нарушаться только между разными записями в одной операции. А вот NT запись... ну кто её применяет — следить надо.