tag:blogger.com,1999:blog-410416665291724878.post3319960295114135703..comments2022-12-19T13:52:22.907+04:00Comments on >рабочие заметки: Cache-coherency #2: от MSI к MESI и далее к звездам (MESIF, MOESI)Ruslan Chereminhttp://www.blogger.com/profile/01023948540752159657noreply@blogger.comBlogger25125tag:blogger.com,1999:blog-410416665291724878.post-27905420964241160232014-01-27T14:04:06.007+04:002014-01-27T14:04:06.007+04:00Я не могу дать строгий ответ на ваши вопросы, но м... Я не могу дать строгий ответ на ваши вопросы, но могу указать на несколько тонкостей:<br /><br />1. release-acquire ordering это не то же самое, что total sync order, который требуется в яве для volatile.<br /><br />2. "SFENCE ... does not affect load operations." - т.е. можно переписать теперь так: LFENCE + LOAD and STORE(without fence) - получается LFENCE здесь единственно, что Ruslan Chereminhttps://www.blogger.com/profile/01023948540752159657noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-77987594375362802122013-12-03T00:39:56.839+04:002013-12-03T00:39:56.839+04:00На x86 гарантия Release-Acquire обеспечивается авт...На x86 гарантия Release-Acquire обеспечивается автоматически: http://peeterjoot.wordpress.com/2009/12/04/intel-memory-ordering-fence-instructions-and-atomic-operations/<br />"On strongly-ordered systems (x86, SPARC, IBM mainframe), release-acquire ordering is automatic for the majority of operations."<br /><br />Так же известно, что MFENCE = LFENCE + SFENCE. Т.е. подход 3 можно AlexeyABhttps://www.blogger.com/profile/10796659906095936242noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-17763817654260946072013-12-03T00:07:58.249+04:002013-12-03T00:07:58.249+04:00Информация эта из JMM cookbook -- ближе к концу пр...Информация эта из <a href="http://g.oswego.edu/dl/jmm/cookbook.html" rel="nofollow">JMM cookbook</a> -- ближе к концу приведена таблица базовых мэппингов для основных архитектур. Возможно, она специфична для JMM, где есть только два memory_order -- SC и relaxed. Возможно, если вводить acquire/release/consume придется играться тоньше. Хотя lazySet (ака mo_release) в JVM тоже реализован простым Ruslan Chereminhttps://www.blogger.com/profile/01023948540752159657noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-86858746964778167662013-12-02T16:47:02.289+04:002013-12-02T16:47:02.289+04:00А есть ссылка где утверждается, что "Ну уровн...А есть ссылка где утверждается, что "Ну уровне ассемблера для x86 все как раз просто. Там только один нетривиальный барьер -- storeload=lock xadd ax,0. Все остальные барьеры noop" ?<br /><br />Известно на x86_64, что MFENCE это LFENCE+SFENCE. И что конкретно вы имеете ввиду, что MFENCE = LFENCE = SFENCE = storeload=lock xadd ax,0 ?<br />Или что LFENCE = nope?<br /><br />Но если LFENCE AlexeyABhttps://www.blogger.com/profile/10796659906095936242noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-30347472284100977862012-07-26T19:42:32.521+04:002012-07-26T19:42:32.521+04:00Ну уровне ассемблера для x86 все как раз просто. Т...Ну уровне ассемблера для x86 все как раз просто. Там только один нетривиальный барьер -- storeload=lock xadd ax,0. Все остальные барьеры noopRuslan Chereminhttps://www.blogger.com/profile/01023948540752159657noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-38791815584319079322012-07-26T18:41:15.151+04:002012-07-26T18:41:15.151+04:00Разобраться хочется именно на низком уровне - на у...Разобраться хочется именно на низком уровне - на уровне ассемблера возможно с деталями реализации на конкретной архитектуре - x86.Anonymoushttps://www.blogger.com/profile/00594070601431702174noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-21497775606650795882012-07-26T18:34:05.747+04:002012-07-26T18:34:05.747+04:00Вот еще неплохая ссылка, может кому пригодится: ht...Вот еще неплохая ссылка, может кому пригодится: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.152.5245&rep=rep1&type=pdfAnonymoushttps://www.blogger.com/profile/00594070601431702174noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-91110592395195018192012-07-26T17:27:42.769+04:002012-07-26T17:27:42.769+04:00>Получается мы можем гарантировать порядок выпо...>Получается мы можем гарантировать порядок выполнения инструкций, а момент времени когда измененные данные будут доступны другим процессорам зависит от конкретной архитектуры.<br /><br />Да, это та вещь, которую мало кто замечает: модель памяти ничего не говорит о времени, она говорит только о порядке. Модель памяти не запрещает процессору хоть на час отложить запись нового значения в память -Ruslan Chereminhttps://www.blogger.com/profile/01023948540752159657noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-56602729548840353822012-07-26T16:02:18.213+04:002012-07-26T16:02:18.213+04:00Абстракции, конечно, абстагируют от деталей реализ...Абстракции, конечно, абстагируют от деталей реализации, но получается, что от деталей реализации не уйти - как в посте про false sharing, например, нужно иметь хотя бы представление о кэш-когерентности и размере кэш-линий.<br /><br />То же самое, видимо, и с барьерами - получается основная их задача упорядочить выполнение блоков инструкций разными потоками, но могут быть дополнительные Anonymoushttps://www.blogger.com/profile/00594070601431702174noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-85879103137302932122012-07-26T15:09:47.418+04:002012-07-26T15:09:47.418+04:00http://mechanical-sympathy.blogspot.com/2011/07/me...http://mechanical-sympathy.blogspot.com/2011/07/memory-barriersfences.htmlAnonymoushttps://www.blogger.com/profile/00594070601431702174noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-1874922123399683782012-07-26T09:27:03.464+04:002012-07-26T09:27:03.464+04:00volatile и барьеры находятся на разных уровнях абс...volatile и барьеры находятся на разных уровнях абстракции -- это разные способы формализовывать модель памяти. Можно формулировать модель памяти в нотации ребер HB, можно в нотации барьеров.<br /><br />Ограничения, накладываемые volatile на конкретной архитектуре реализуются расстановкой каких-то барьеров. Барьеры, в свою очередь, абстрагируют вас от совсем низкоуровневых деталей реализации -- Ruslan Chereminhttps://www.blogger.com/profile/01023948540752159657noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-51490263071995268332012-07-26T02:30:55.702+04:002012-07-26T02:30:55.702+04:00Да, я именно хотел пока разобраться в частном случ...Да, я именно хотел пока разобраться в частном случае, где реализована аппаратная кэш-когерентность.<br /><br />Тогда чтобы как-то резюмировать: volatile дает нам гарантию, что компилятор не переставит операцию чтения с другими инструкциями, но для того, чтобы считать именно "свежее" значение все-равно нужен барьер, который заполнит store buffer новыми данными перед их считыванием?<br />Anonymoushttps://www.blogger.com/profile/00594070601431702174noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-62718891950756669752012-07-26T00:09:29.744+04:002012-07-26T00:09:29.744+04:00Если вы хотите понимать, что такое volatile семант...Если вы хотите понимать, что такое volatile <i>семантически</i> -- вам нужно разобраться в том, что такое модель памяти, и в каких терминах формулируется модель памяти в яве. Если вы хотите разобраться в том, что такое volatile <i>на уровне реализации JVM на процессорах Интел с аппаратной кэш-когерентностью</i> -- то это более частный вопрос. И эти вопросы не надо путать, потому что это разные Ruslan Chereminhttps://www.blogger.com/profile/01023948540752159657noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-68439294806074439822012-07-25T21:09:07.478+04:002012-07-25T21:09:07.478+04:00Я соственно и имел ввиду, что вставлять mov ax,[x]...Я соственно и имел ввиду, что вставлять mov ax,[x] именно для того, чтобы обновить значение в регистре и только тогда, когда нам этого надо. Например для считывания volatile переменной.<br /><br />Я не совсем улавливаю разницы между чтением значения из кэша и чтением из памяти. Ведь, как Вы заметили, если свежее значение уже есть в кэше, то мы его и получим. Если его нет, то спросим у других и, вAnonymoushttps://www.blogger.com/profile/00594070601431702174noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-38950095296753829822012-07-25T17:30:09.563+04:002012-07-25T17:30:09.563+04:00А компилятор прямо-таки всегда будет вставлять так...А компилятор прямо-таки всегда будет вставлять такую инструкцию? А если, скажем, 5 инструкций назад он уже зачитал эту ячейку памяти в регистр -- тоже перечитывать будет?<br /><br />Кроме того, mov ax, [x] не обязательно даст значение из памяти. Если вы недавно записали значение в [x], и запись еще висит в store buffer -- чтение может быть удовлетворено прямо оттуда, это быстрее.Ruslan Chereminhttps://www.blogger.com/profile/01023948540752159657noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-79352287380728359392012-07-25T16:45:51.562+04:002012-07-25T16:45:51.562+04:00Про чтение все-таки не понял почему нужен мембар. ...Про чтение все-таки не понял почему нужен мембар. <br /><br />Компилятор вставляет инструкцию:<br /><br /> mov ax, [x]<br /><br />Разве этого не достаточно, для того чтобы всегда перечитывать свежее значение?Anonymoushttps://www.blogger.com/profile/00594070601431702174noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-25632820398305721082012-07-25T16:20:40.854+04:002012-07-25T16:20:40.854+04:00Барьеры памяти и когерентность -- они просто про р...Барьеры памяти и когерентность -- они просто про разные аспекты. Барьер памяти (их много может быть разных) задает упорядочивание между инструкциями обращения к памяти. Вы просто говорите системе: (компилятору, процессору, контроллеру памяти) "я хочу, чтобы действие А ни в коем случае не возымело эффект раньше, чем действие Б". Как именно система будет это выполнять -- вас не волнует. Ruslan Chereminhttps://www.blogger.com/profile/01023948540752159657noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-37075900605184562662012-07-25T15:47:15.124+04:002012-07-25T15:47:15.124+04:00Спасибо, теперь все встало на свои места... почти
...Спасибо, теперь все встало на свои места... почти<br /><br />То есть получается, если предположить, что архитектура поддерживает кэш-когерентность, компилятору нет необходимости вставлять мембар, достаточно вставить операцию считывания/записи значения из/в память?<br /><br />Либо еще могу предположить, об этом писалось в обном из посте, что операции записи могут быть отложены, а мембар как раз Anonymoushttps://www.blogger.com/profile/00594070601431702174noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-68052944432327897762012-07-25T11:42:44.026+04:002012-07-25T11:42:44.026+04:00@igor
Вы упускаете то, что
а) далеко не все ар...@igor <br /><br />Вы упускаете то, что <br /><br />а) далеко не все архитектуры процессоров/памяти реализуют аппаратную кэш-когерентность.<br /><br />б) даже на кэш-когерентной архитектуре вам может "ответить" регистр процессораRuslan Chereminhttps://www.blogger.com/profile/01023948540752159657noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-71814634389811382532012-07-25T06:38:10.188+04:002012-07-25T06:38:10.188+04:00Спрошу глупость :) - а для чего тогда нужен volati...Спрошу глупость :) - а для чего тогда нужен volatile? Ведь получается, если взять, к примеру, MESIF, что при чтении значения переменной другим потоком нам в любом случае ответит либо основная память, либо кэш, у которого эта запись в состоняи Forwarded. Что я упускаю?Anonymoushttps://www.blogger.com/profile/00594070601431702174noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-19356672961160247582012-07-22T11:12:57.429+04:002012-07-22T11:12:57.429+04:00>Откуда следует, что тот, кто следующим захочет...>Откуда следует, что тот, кто следующим захочет себе в кеш копию, будет ближе к тому, у кого F?<br /><br />Честно говоря, я уже не помню. Само утверждение я встретил где-то в описании MESIF, деталей там не было. Когда я писал, у меня в голове были какие-то примеры ситуаций, где это работает, но дописывать еще пару абзацев с эвристиками сил уже не было :)<br /><br />Ну идея такая, что если твойRuslan Chereminhttps://www.blogger.com/profile/01023948540752159657noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-31747722047122041572012-07-22T04:00:33.556+04:002012-07-22T04:00:33.556+04:00Чётко всё описал. Могёшь! Разработчик вообще инжен...Чётко всё описал. Могёшь! Разработчик вообще инженер! Буду тебя пиарить ссылкой на эту статью :)<br /><br />Только вот лично я не понял, почему:<br /><br /><i>Дополнительные бонусы возникают в случае NUMA архитектуры -- собственно, Nehalem именно ей и является. В случае NUMA ответственная F-копия будет чаще оказываться в "территориально" более близком блоке кэша -- <b>более близком к gvsmirnovhttps://www.blogger.com/profile/09213176675225121755noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-53498079911832030722012-02-13T12:06:49.443+04:002012-02-13T12:06:49.443+04:00Да - именно модель, првда сами эксперименты не оче...Да - именно модель, првда сами эксперименты не очень интересуют. Больше интересует не разучился ли я программировать такие модели.Pavel Vinogradovhttps://www.blogger.com/profile/17490801436528300797noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-38209173140021645632012-02-08T15:51:17.416+04:002012-02-08T15:51:17.416+04:00Реализовать -- в смысле "построить модель&quo...Реализовать -- в смысле "построить модель"? Я сам подумывал о симуляционной модели -- хотел просчитать кривую пропускной способности при увеличении contention, например. Но пока не до того, да и мне больше хотелось чисто математическую модель, чем симуляционнуюRuslan Chereminhttps://www.blogger.com/profile/01023948540752159657noreply@blogger.comtag:blogger.com,1999:blog-410416665291724878.post-33884161406860815542012-02-08T15:37:21.479+04:002012-02-08T15:37:21.479+04:00С большим интересом прочитал. К кэшам процессоров ...С большим интересом прочитал. К кэшам процессоров конечно никакого отношения не имею, но для себя представлял это в виде нескольких узлов, соединенных MQ шиной.<br /><br />Интересно было-бы попробовать реализовать это из чисто практического интереса.Pavel Vinogradovhttps://www.blogger.com/profile/17490801436528300797noreply@blogger.com