программистское
Sep. 19th, 2010 12:32 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
до сих пор не осознавал четко, что время в каждом процессоре бежит по-своему и что никакого опреденного порядка доступа к памяти нет, а есть только видимость с точки зрения каждого процессора.
Ну, скажем, в Intel x86 можно считать, что на каждой команде записи в память стоит release-барьер, а на каждой команде чтения из памяти стоит acquire-барьер, а на каждой lock-инструкции стоит двусторонний барьер, но вот что означает слово "total" в предложении "locked instructions have a total order", и почему об этом вообще надо отдельно говорить, до меня как-то не доходило.
Вот, скажем, и по этой ссылке http://www.bluebytesoftware.com/blog/2008/07/17/LoadsCannotPassOtherLoadsIsAMyth.aspx далеко не последний человек в Микрософте и автор толстенной книжки по мультитреду выглядит смущенным фактом того, что не существует самого по себе "общего порядка", "total order" исполнения операций процессорами. Тот факт, что два процессора могут быть несогласны относительно того, кто из них раньше, а кто позже выполнил свою операцию записи в память он трактует как то, что операции чтения из памяти могут переупорядочиваться (мол, вопреки обещаниям компинии Intel и вопреки спекам процессора). Меж тем, никакого абсолютного "раньше и позже" тут нет, поскольку речь идет о чтении данных, записанных двумя разными процессорами. И в этом всё дело.
Ну, скажем, в Intel x86 можно считать, что на каждой команде записи в память стоит release-барьер, а на каждой команде чтения из памяти стоит acquire-барьер, а на каждой lock-инструкции стоит двусторонний барьер, но вот что означает слово "total" в предложении "locked instructions have a total order", и почему об этом вообще надо отдельно говорить, до меня как-то не доходило.
Вот, скажем, и по этой ссылке http://www.bluebytesoftware.com/blog/2008/07/17/LoadsCannotPassOtherLoadsIsAMyth.aspx далеко не последний человек в Микрософте и автор толстенной книжки по мультитреду выглядит смущенным фактом того, что не существует самого по себе "общего порядка", "total order" исполнения операций процессорами. Тот факт, что два процессора могут быть несогласны относительно того, кто из них раньше, а кто позже выполнил свою операцию записи в память он трактует как то, что операции чтения из памяти могут переупорядочиваться (мол, вопреки обещаниям компинии Intel и вопреки спекам процессора). Меж тем, никакого абсолютного "раньше и позже" тут нет, поскольку речь идет о чтении данных, записанных двумя разными процессорами. И в этом всё дело.
no subject
Date: 2010-09-19 08:23 am (UTC)и я имел в виду скорее, что процессор не будет читать одну и ту же переменную десять раз подряд в треде А, если он сам ее не менял. Впрочем, если меня - тоже не будет - он же ее и так знает. :-))))
no subject
Date: 2010-09-19 09:00 am (UTC)Но дальше кэша не уйдёт. Кэш и есть его хранилище для часто используемых переменных. А вот чтобы в кэше значение когда надо менялось, за этим механизм синхронизации кэшей следит.
Мне помнится где-то в Intel`овских доках на глаза попадалась фраза, что дескать мы стараемся по мере возможности поддерживать для софта иллюзию того, что он выполняется на тупом CPU без всяких кэшей и прочих наворотов. Но навскидку сейчас не помню где.
no subject
Date: 2010-09-19 03:26 pm (UTC)вопрос лишь в том, в каком пункте спека это отражено.
кэш пофиг. с точки зрения упорядоченности доступа к памяти когерентный кеш неотличи от самой памяти, про него можно забыть.
> что он выполняется на тупом CPU без всяких кэшей и прочих наворотов
угу. тупой ЦПУ для тупого программиста.
no subject
Date: 2010-09-19 05:40 pm (UTC)Пока не специально не оговорено, наличие в описании команды фразы "the destination operand can be a ... memory location", означает, что в результате её выполнения данные доходят до оперативки.
Аналогично с чтением.
Т.е. суть в том, что логика команд соответствует описанию. И процессор не будет пытаться её изменить, а только лишь слегка хитрит. Поэтому пока явно не написано: "CPU будет забивать на чтение данных из переменной, если он туда не пишет", то следует считать, что команда будет выполнять чтение каждый раз.
Короче, это написано в Instruction Set Reference. ;)