Memory barrier не могу понять что это
От: dsalodki Беларусь http://dsalodki.wix.com/resume
Дата: 03.04.23 08:47
Оценка: +1
Поясните пожалуйста самым простым способом, я гуглю, но что-то не понятно. Толи это позволяет отменить кеширование переменно, толи ещё что-то
Re: Memory barrier не могу понять что это
От: kov_serg Россия  
Дата: 03.04.23 09:02
Оценка: +1 -1
Здравствуйте, dsalodki, Вы писали:

D>Поясните пожалуйста самым простым способом, я гуглю, но что-то не понятно. Толи это позволяет отменить кеширование переменно, толи ещё что-то


https://www.youtube.com/watch?v=nh9Af9z7cgE
Re[2]: Memory barrier не могу понять что это
От: dsalodki Беларусь http://dsalodki.wix.com/resume
Дата: 03.04.23 09:05
Оценка: +1 -1
Спасибо, но я бы не писал на русскоязычный форум, если бы знал английский
Re[3]: Memory barrier не могу понять что это
От: kov_serg Россия  
Дата: 03.04.23 09:20
Оценка:
Здравствуйте, dsalodki, Вы писали:

D>Спасибо, но я бы не писал на русскоязычный форум, если бы знал английский

Это не должно вас останавливать.
Re: Memory barrier не могу понять что это
От: samius Япония http://sams-tricks.blogspot.com
Дата: 03.04.23 09:32
Оценка: 37 (3) +1
Здравствуйте, dsalodki, Вы писали:

D>Поясните пожалуйста самым простым способом, я гуглю, но что-то не понятно. Толи это позволяет отменить кеширование переменно, толи ещё что-то

Это инструкция, запрещающая перенос инструкций через себя при переупорядочивании.
Re: Memory barrier не могу понять что это
От: Pzz Россия https://github.com/alexpevzner
Дата: 03.04.23 11:07
Оценка: 164 (6) +5
Здравствуйте, dsalodki, Вы писали:

D>Поясните пожалуйста самым простым способом, я гуглю, но что-то не понятно. Толи это позволяет отменить кеширование переменно, толи ещё что-то


Вот смотри, ты пишешь:

a = 5;
b = 10;


И рассчитываешь, что если в b уже 10, то в a точно 5.

Однако процессор может, по разным причинам, исполнить эти команды в другом порядке. В частности потому, что доступ в память, он не так уж и просто устроен, до одних мест может оказаться в данный момент быстрее дотянуться, до других — наоборот.

Причем в пределах простого линейного кода это все будет незаметно, процессор сам позаботится о том, чтобы все выстроить в нужном порядке, создав иллюзию, что с памятью все ОК. А вот если на другом ядре, в другом потоке исполняется код, который тоже пользуется этими переменнымы, то эти два ядра могут промеж собой и не договориться.

Вот тут-то и нужны явные барьеры памяти, чтобы сказать процессору, "доделай, пожалуйста, все операции с памятью, которые я заказывал до этого места, потому что дальше логика моей программы будет рассчитывать на то, что все отложенные/параллельные операции к этому месту уже доделаны"
Re[2]: Memory barrier не могу понять что это
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 03.04.23 11:51
Оценка:
Здравствуйте, Pzz, Вы писали:


Pzz>Вот тут-то и нужны явные барьеры памяти, чтобы сказать процессору, "доделай, пожалуйста, все операции с памятью, которые я заказывал до этого места, потому что дальше логика моей программы будет рассчитывать на то, что все отложенные/параллельные операции к этому месту уже доделаны"


На пальцах вроде всё понятно, но вот в те же плюсики завезли чуть ли не штук пять различных типов барьеров. Я пока плотно вопрос не изучал, но по диагонали — нифига не понял, чем отличаются
Маньяк Робокряк колесит по городу
Re[3]: Memory barrier не могу понять что это
От: Pzz Россия https://github.com/alexpevzner
Дата: 03.04.23 12:54
Оценка: +2
Здравствуйте, Marty, Вы писали:

M>На пальцах вроде всё понятно, но вот в те же плюсики завезли чуть ли не штук пять различных типов барьеров. Я пока плотно вопрос не изучал, но по диагонали — нифига не понял, чем отличаются


Ну, я описал самый простой случай полного барьера, который полностью отделяет операции "до барьера" от операций "после барьера". Он очень дорогой, и в реальной жизни обычно столько не нужно. Нам, например, может быть важно, чтобы все записи, которые по тексту программы стоят до барьера, до него и произошли, а что там с чтениями, может быть и не важно. Кроме того, у разных процессоров разная модель памяти, а стандарт C++, он, типа, всехний. Поэтому пытается покрыть все возможные варианты. На каком-то конкретном железе разные варианты могут и совпадать, но это не значит, что они будут совпадать на другом железе.
Re[2]: Memory barrier не могу понять что это
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 03.04.23 13:02
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Вот тут-то и нужны явные барьеры памяти, чтобы сказать процессору, "доделай, пожалуйста, все операции с памятью, которые я заказывал до этого места, потому что дальше логика моей программы будет рассчитывать на то, что все отложенные/параллельные операции к этому месту уже доделаны"


А что они физически представляют? Функцию, инструкцию процессора или что?
Re[3]: Memory barrier не могу понять что это
От: paradok  
Дата: 03.04.23 13:20
Оценка:
Здравствуйте, Pauel, Вы писали:

P>Здравствуйте, Pzz, Вы писали:


Pzz>>Вот тут-то и нужны явные барьеры памяти, чтобы сказать процессору, "доделай, пожалуйста, все операции с памятью, которые я заказывал до этого места, потому что дальше логика моей программы будет рассчитывать на то, что все отложенные/параллельные операции к этому месту уже доделаны"


P>А что они физически представляют? Функцию, инструкцию процессора или что?


a=10
b=5
но a + b = любое число? или вовсе не инициализировано?
Re[2]: Memory barrier не могу понять что это
От: paradok  
Дата: 03.04.23 13:22
Оценка:
Здравствуйте, Pzz, Вы писали:



Pzz>Вот смотри, ты пишешь:


Pzz>
Pzz>a = 5;
Pzz>b = 10;
Pzz>


Pzz>И рассчитываешь, что если в b уже 10, то в a точно 5.


а в реальности что бывает
a=5
b=10
a>b=true

?
Re[3]: Memory barrier не могу понять что это
От: Pzz Россия https://github.com/alexpevzner
Дата: 03.04.23 13:33
Оценка: 10 (1)
Здравствуйте, Pauel, Вы писали:

Pzz>>Вот тут-то и нужны явные барьеры памяти, чтобы сказать процессору, "доделай, пожалуйста, все операции с памятью, которые я заказывал до этого места, потому что дальше логика моей программы будет рассчитывать на то, что все отложенные/параллельные операции к этому месту уже доделаны"


P>А что они физически представляют? Функцию, инструкцию процессора или что?


В Си — функцию. Которая, фактически, превращается в инструкцию процессора.

https://stackoverflow.com/questions/50323347/how-many-memory-barriers-instructions-does-an-x86-cpu-have
Re[3]: Memory barrier не могу понять что это
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 03.04.23 13:57
Оценка:
Здравствуйте, paradok, Вы писали:

P>а в реальности что бывает

P> a=5
P> b=10
P> a > b=true

P>?

P>

На одном процессоре такого не будет, процессор следит за зависимостями, и подкладывает результаты в соответствии с зависимостями.
Re[3]: Memory barrier не могу понять что это
От: Sharowarsheg  
Дата: 03.04.23 15:59
Оценка:
Здравствуйте, paradok, Вы писали:

P>а в реальности что бывает

P>a=5
P>b=10
a > b=true

Да, если a=5 b = 10 выполняется на одном процессоре, а сравнение на другом.
Re[3]: Memory barrier не могу понять что это
От: Aquilaware  
Дата: 03.04.23 18:23
Оценка:
Здравствуйте, Marty, Вы писали:

M>На пальцах вроде всё понятно, но вот в те же плюсики завезли чуть ли не штук пять различных типов барьеров. Я пока плотно вопрос не изучал, но по диагонали — нифига не понял, чем отличаются


Разные типы барьеров используется для достижения дополнительных выигрышей в производительности. Самый базовый тип — это полный барьер (на чтение и на запись), его используют всегда по-умолчанию. Но если у разработчика есть достаточная необходимость и квалификация, то он может выбирать и более легкие подтипы барьера для конкретных задач где это уместно.

Каждый конкретный язык/среда предоставляет свой набор примитивов для барьеров, поэтому их API могут отличатся, но базовый принцип один и тот же.
Re[2]: Memory barrier не могу понять что это
От: Codealot Земля  
Дата: 03.04.23 18:53
Оценка:
Здравствуйте, samius, Вы писали:

S>Это инструкция, запрещающая перенос инструкций через себя при переупорядочивании.


Не только. Барьеры также касаются синхронизации кэшей разных ядер.
Ад пуст, все бесы здесь.
Re[2]: Memory barrier не могу понять что это
От: Sharov Россия  
Дата: 03.04.23 19:26
Оценка:
Здравствуйте, samius, Вы писали:

S>Здравствуйте, dsalodki, Вы писали:


D>>Поясните пожалуйста самым простым способом, я гуглю, но что-то не понятно. Толи это позволяет отменить кеширование переменно, толи ещё что-то

S>Это инструкция, запрещающая перенос инструкций через себя при переупорядочивании.

Это вроде volatile делает, а барьер на уровне железа просит закоммитить все возможные
изменения в памяти и привести кэши в порядок. Просто инструкции может перенести компилятор и
volatile ему это не даст.
Кодом людям нужно помогать!
Re[3]: Memory barrier не могу понять что это
От: Codealot Земля  
Дата: 03.04.23 20:51
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Это вроде volatile делает, а барьер на уровне железа просит закоммитить все возможные

S>изменения в памяти и привести кэши в порядок. Просто инструкции может перенести компилятор и
S>volatile ему это не даст.

ЕМНИП volatile — один из частных видов барьера памяти.
Ад пуст, все бесы здесь.
Re[4]: Memory barrier не могу понять что это
От: Sharov Россия  
Дата: 03.04.23 22:25
Оценка:
Здравствуйте, Codealot, Вы писали:

S>>Это вроде volatile делает, а барьер на уровне железа просит закоммитить все возможные

S>>изменения в памяти и привести кэши в порядок. Просто инструкции может перенести компилятор и
S>>volatile ему это не даст.
C>ЕМНИП volatile — один из частных видов барьера памяти.

Скорее способ сказать компилятору, чтобы он не занимался соотв. оптимизациями с соотв.
переменной. Ну и вроде соотв. доп. инструкции барьеров генерятся, хотя для х86 вроде бы
особого смысл они не имеют. Тут в тему должен ворваться netch80 и все объяснить.
Кодом людям нужно помогать!
Re[3]: Memory barrier не могу понять что это
От: samius Япония http://sams-tricks.blogspot.com
Дата: 04.04.23 04:04
Оценка: 6 (1) +2 -1
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, samius, Вы писали:


S>>Здравствуйте, dsalodki, Вы писали:


D>>>Поясните пожалуйста самым простым способом, я гуглю, но что-то не понятно. Толи это позволяет отменить кеширование переменно, толи ещё что-то

S>>Это инструкция, запрещающая перенос инструкций через себя при переупорядочивании.

S>Это вроде volatile делает, а барьер на уровне железа просит закоммитить все возможные

S>изменения в памяти и привести кэши в порядок. Просто инструкции может перенести компилятор и
S>volatile ему это не даст.

volatile как модификатор переменной — запрет на кэширование. volatile как инструкция — запрет на чтение/запись из кэша в конкретном месте, т.е. немного не о том в общем случае, но в частном (C# и .NET) volatile фактически генерирует вокруг обращений еще и барьеры. В языках, где volatile не генерирует барьеры, проще представить одно без другого.
Барьер же — это идея, а не команда кэшам, которую они выполняют. Идея о том, что порядок операций должен быть вот такой, меняться он может "так" и "этак", но не "вот так", и эффекты от этих операций "ощутимы вот таким образом". А железо, в свою очередь (даже не само железо, а модель памяти, скорее), должно соответствовать и обеспечивать корректную работу этой идеи. Если для этого требуется сбросить кэши — будет исполнено. Если потребуется затормозить ядро — будет так.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.