Сообщение 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 сейчас дословно говорит
Вот с последним могут быть хитрые проблемы (вот заложились вы что memset это запись, а оно сделано через STOS...)
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 сейчас дословно говорит
Про string operations — там порядок может нарушаться только между разными записями в одной операции. А вот NT запись... ну кто её применяет — следить надо.
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 запись... ну кто её применяет — следить надо.