Сообщение Re[3]: Memory barrier не могу понять что это от 05.04.2023 14:47
Изменено 05.04.2023 15:02 vsb
Re[3]: Memory barrier не могу понять что это
Здравствуйте, snaphold, Вы писали:
F>>PS Это справедливо для абстрактного процессора в вакууме. Все(кроме NUMA) процессоры с архитектура x86/x64 сделаны так, что все ядра знают про кэши соседних ядер, и соответственно ни каких барьеров памяти в них нет.
S>сначала вроде понял и уложил в памяти а потом вот это и непонятно тогда зачем мемори барьер нужен если ядря знают про кэши других ядер?
Ядра не знают про кеши других ядер. Существует некий протокол, который синхронизирует кеши, но это происходит как бы асинхронно. Процессор не ждёт окончания этой синхронизации для следующих операций. Он записал в кеш значение и потом специальное оборудование, которое управляет этим кешом, начинает рассылку сообщений по межпроцессорной шине, что по такому-то адресу значение поменялось. Эти сообщения через некоторое количество тактов достигнут другого ядра, другое ядро проверит, есть ли в его кеше такой адрес, если есть, то обновит в нём значение и так далее. То бишь если ты меняешь значение в памяти на одном процессоре, то другой процессор когда-нибудь его увидит. Но когда и в каком порядке — тут гарантий никаких без дополнительных инструкций не будет.
PS да, есть ещё проблема, что компилятор может "соптимизировать" обращения в память и вообще туда ничего не писать, используя регистр для этого. Тогда, конечно, ничего синхронизировать никто не будет, регистры это полностью приватные данные для процессора. Но это уже другой разговор.
F>>PS Это справедливо для абстрактного процессора в вакууме. Все(кроме NUMA) процессоры с архитектура x86/x64 сделаны так, что все ядра знают про кэши соседних ядер, и соответственно ни каких барьеров памяти в них нет.
S>сначала вроде понял и уложил в памяти а потом вот это и непонятно тогда зачем мемори барьер нужен если ядря знают про кэши других ядер?
Ядра не знают про кеши других ядер. Существует некий протокол, который синхронизирует кеши, но это происходит как бы асинхронно. Процессор не ждёт окончания этой синхронизации для следующих операций. Он записал в кеш значение и потом специальное оборудование, которое управляет этим кешом, начинает рассылку сообщений по межпроцессорной шине, что по такому-то адресу значение поменялось. Эти сообщения через некоторое количество тактов достигнут другого ядра, другое ядро проверит, есть ли в его кеше такой адрес, если есть, то обновит в нём значение и так далее. То бишь если ты меняешь значение в памяти на одном процессоре, то другой процессор когда-нибудь его увидит. Но когда и в каком порядке — тут гарантий никаких без дополнительных инструкций не будет.
PS да, есть ещё проблема, что компилятор может "соптимизировать" обращения в память и вообще туда ничего не писать, используя регистр для этого. Тогда, конечно, ничего синхронизировать никто не будет, регистры это полностью приватные данные для процессора. Но это уже другой разговор.
Re[3]: Memory barrier не могу понять что это
Здравствуйте, snaphold, Вы писали:
F>>PS Это справедливо для абстрактного процессора в вакууме. Все(кроме NUMA) процессоры с архитектура x86/x64 сделаны так, что все ядра знают про кэши соседних ядер, и соответственно ни каких барьеров памяти в них нет.
S>сначала вроде понял и уложил в памяти а потом вот это и непонятно тогда зачем мемори барьер нужен если ядря знают про кэши других ядер?
Ядра не знают про кеши других ядер. Существует некий протокол, который синхронизирует кеши, но это происходит как бы асинхронно. Процессор не ждёт окончания этой синхронизации для следующих операций. Он записал в кеш значение и потом специальное оборудование, которое управляет этим кешом, начинает рассылку сообщений по межпроцессорной шине, что по такому-то адресу значение поменялось. Эти сообщения через некоторое количество тактов достигнут другого ядра, другое ядро проверит, есть ли в его кеше такой адрес, если есть, то обновит в нём значение и так далее. То бишь если ты меняешь значение в памяти на одном процессоре, то другой процессор когда-нибудь его увидит. Но когда и в каком порядке — тут гарантий никаких без дополнительных инструкций не будет.
PS да, есть ещё проблема, что компилятор может "соптимизировать" обращения в память и вообще туда ничего не писать, используя регистр для этого. Тогда, конечно, ничего синхронизировать никто не будет, регистры это полностью приватные данные для процессора. Но это уже другой разговор.
PPS всё, что писали про то, что процессоры могут переупорядочивать запись в память тоже верно и тоже может вызывать неожиданное поведение у другого процессора, читающего ту же память. В общем тема довольно запутанная и моё имхо — лучше всего пользоваться примитивами синхронизации, которые на современных процессорах весьма быстрые, а про барьеры пускай думают те, кто пишет их реализации. Ну и про volatile не забывать, чтобы компилятор не слишком увлекался оптимизациями.
F>>PS Это справедливо для абстрактного процессора в вакууме. Все(кроме NUMA) процессоры с архитектура x86/x64 сделаны так, что все ядра знают про кэши соседних ядер, и соответственно ни каких барьеров памяти в них нет.
S>сначала вроде понял и уложил в памяти а потом вот это и непонятно тогда зачем мемори барьер нужен если ядря знают про кэши других ядер?
Ядра не знают про кеши других ядер. Существует некий протокол, который синхронизирует кеши, но это происходит как бы асинхронно. Процессор не ждёт окончания этой синхронизации для следующих операций. Он записал в кеш значение и потом специальное оборудование, которое управляет этим кешом, начинает рассылку сообщений по межпроцессорной шине, что по такому-то адресу значение поменялось. Эти сообщения через некоторое количество тактов достигнут другого ядра, другое ядро проверит, есть ли в его кеше такой адрес, если есть, то обновит в нём значение и так далее. То бишь если ты меняешь значение в памяти на одном процессоре, то другой процессор когда-нибудь его увидит. Но когда и в каком порядке — тут гарантий никаких без дополнительных инструкций не будет.
PS да, есть ещё проблема, что компилятор может "соптимизировать" обращения в память и вообще туда ничего не писать, используя регистр для этого. Тогда, конечно, ничего синхронизировать никто не будет, регистры это полностью приватные данные для процессора. Но это уже другой разговор.
PPS всё, что писали про то, что процессоры могут переупорядочивать запись в память тоже верно и тоже может вызывать неожиданное поведение у другого процессора, читающего ту же память. В общем тема довольно запутанная и моё имхо — лучше всего пользоваться примитивами синхронизации, которые на современных процессорах весьма быстрые, а про барьеры пускай думают те, кто пишет их реализации. Ну и про volatile не забывать, чтобы компилятор не слишком увлекался оптимизациями.