Ну вот еще один аргумент для Аццко, почему для pre-C99 кода - лучше возвращать value != 0, а не просто valueМальчик-Одуванчик wrote: Спокойно усекает до 0
Индусские программисты и индусский код
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Индусские программисты и индусский код
-
- Уже с Приветом
- Posts: 4185
- Joined: 27 Apr 2011 03:43
- Location: Сергели ->Chicago
Re: Индусские программисты и индусский код
почитав посты, создается ощущение, что весь этот индусский код написан совсем не индусами
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Индусские программисты и индусский код
Мне кажется в данном случае(в контексте заданной задачки) основной фактор это не выравнивание и количество чтений, а когда программа решит засинхронизировать изменения из кеша/регистров в общую память. Как то неочевидно как без volatile и Atomic* можно такое гарантировать.Alexandr wrote:скажем так: всегда атомарно, если выравнен на границе слова. По умолчанию - это всегда так: что в C++ (до C++11 вообще понятия memory consistency model не существовало), что в C#, что в Javacrypto5 wrote:Что вы вкладываете в слово "могу"? инт на 32 разрядной платформе всегда атомарно читается? Или нужны какие то дополнительные телодвижения?Alexandr wrote:т.е. грубо говоря int на 32 разрядной платформе я могу атомарно записать и прочитать без всяких volatile и interlockedcrypto5 wrote:С этим не поспоришьАццкоМото wrote: Ну в джаве и операции не атомарные. Если представить себе сферический одноядерный контупер с переключением контекста промеж потоков, общей памятью и атомарными операциями - то получается разница. каждый дополнительный уровень абстракции будет только добавлять пачку "да, но если ***, то все-таки нет"
но можно руками добиться того, чтобы оно не было выравнено правильно (один кусок будет на одной строке кеша, другой на другой), тогда для чтения или записи нужно выполнить 2 чтения (сейчас процессоры сами работают с невыравненными данными, скорее всего операция все равно не атомарна, так как пока читает сам процессор с одной строки, вторая может быть в кеше другого процессора и туда что-то пишут)
In vino Veritas!
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Индусские программисты и индусский код
Да какой же это аргумент? Возвращать нужно то, что декларируешь, а не абы что - хоть в pre-C99, хоть в С99, иначе ногу так и сяк отстрелишь, не с булами, так в другом местеИнтеррапт wrote:Ну вот еще один аргумент для Аццко, почему для pre-C99 кода - лучше возвращать value != 0, а не просто valueМальчик-Одуванчик wrote: Спокойно усекает до 0
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 3647
- Joined: 23 May 2010 15:10
Re: Индусские программисты и индусский код
Вы ж мой хороший, в Java (как и в C#) примитивные данные изначально всегда (аллокатор любит это делать) выравнены как надо,АццкоМото wrote:Смотреть на выделенное и фтыкать тут: http://lurkmore.to/%D0%92%D0%B7%D0%B0%D ... 1%84%D1%8BAlexandr wrote: поспоришь, в Java, как и в C#, как и в C++, всегда можно атомарно прочитать или записать, если размер типа меньше либо равен разрядности шины (проще говоря, размеру регистра), если правильно выравнено, что для простых типов всегда так и для C++ и для C# и для Java. (правда в отличии от C++ на C# и Java long не гарантирован atomic, чтобы не было разницы между 32 разрядной JVM и 64 разрядной)
т.е. грубо говоря int на 32 разрядной платформе я могу атомарно записать и прочитать без всяких volatile и interlocked
конечно операции: чтение + последующая запись, чтение + изменение + запись не атомарны
а вот если руками лезть (типа Layout.Explicit и Offset в структурах на C# ставить), то можно и кое-что сломать
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Индусские программисты и индусский код
Ну вы как-то предметней что-ли расскажите, кем же этот код написан.valchkou wrote:почитав посты, создается ощущение, что весь этот индусский код написан совсем не индусами
-
- Уже с Приветом
- Posts: 3647
- Joined: 23 May 2010 15:10
Re: Индусские программисты и индусский код
для процессора вообще пофигу, когда это произойдет. Есть Cache Coherency Protocol (MESI), есть Processor Consistency Memory Model и этого достаточно (точнее второго достаточно, первое вообще подразумевается by default).crypto5 wrote:Мне кажется в данном случае(в контексте заданной задачки) основной фактор это не выравнивание и количество чтений, а когда программа решит засинхронизировать изменения из кеша/регистров в общую память. Как то неочевидно как без volatile и Atomic* можно такое гарантировать.Alexandr wrote:скажем так: всегда атомарно, если выравнен на границе слова. По умолчанию - это всегда так: что в C++ (до C++11 вообще понятия memory consistency model не существовало), что в C#, что в Javacrypto5 wrote:Что вы вкладываете в слово "могу"? инт на 32 разрядной платформе всегда атомарно читается? Или нужны какие то дополнительные телодвижения?Alexandr wrote:т.е. грубо говоря int на 32 разрядной платформе я могу атомарно записать и прочитать без всяких volatile и interlockedcrypto5 wrote: С этим не поспоришь
но можно руками добиться того, чтобы оно не было выравнено правильно (один кусок будет на одной строке кеша, другой на другой), тогда для чтения или записи нужно выполнить 2 чтения (сейчас процессоры сами работают с невыравненными данными, скорее всего операция все равно не атомарна, так как пока читает сам процессор с одной строки, вторая может быть в кеше другого процессора и туда что-то пишут)
Пофигу абсолютно, хотя когда, впринципе можно и на этот вопрос ответить (Intel x86/x64):
из регистра в кеш - когда инструкция записи в регистр пройдет retirement block и либо попадет в Store Buffer + Read (прочитать строку в кеш), после того как строка придет, оно из Store Buffer сразу попадет в L1, либо сразу в кеш, если данная кеш линия загружена (т.е. Invalid bit сброшен)
из кеша в память - например, на Nehalem архитектере, когда последнему L3 кешу (он inclusive, т.е. включает данные предыдущих кешей) придет сообщение либо Invalidate, либо Read Invalidate
но опять же, это процессору полностью пофигу
Last edited by Alexandr on 30 Jan 2013 22:57, edited 1 time in total.
-
- Уже с Приветом
- Posts: 4185
- Joined: 27 Apr 2011 03:43
- Location: Сергели ->Chicago
Re: Индусские программисты и индусский код
почти на каждый приведенный пример якобы индуского кода нашлось аргументированое обоснование русского программиста.Интеррапт wrote:Ну вы как-то предметней что-ли расскажите, кем же этот код написан.valchkou wrote:почитав посты, создается ощущение, что весь этот индусский код написан совсем не индусами
а вам так не показалось?
-
- Уже с Приветом
- Posts: 3647
- Joined: 23 May 2010 15:10
Re: Индусские программисты и индусский код
очень часто виделИнтеррапт wrote:Ну вот еще один аргумент для Аццко, почему для pre-C99 кода - лучше возвращать value != 0, а не просто valueМальчик-Одуванчик wrote: Спокойно усекает до 0
Code: Select all
return !!value;
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Индусские программисты и индусский код
Да, про это я на прошлой странице уже написал ))Alexandr wrote: очень часто виделCode: Select all
return !!value;
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Индусские программисты и индусский код
Для процессора может и пофиг, а на возможные результаты выполнения программы это сильно влияет.Alexandr wrote:для процессора вообще пофигу, когда это произойдет.crypto5 wrote:Мне кажется в данном случае(в контексте заданной задачки) основной фактор это не выравнивание и количество чтений, а когда программа решит засинхронизировать изменения из кеша/регистров в общую память. Как то неочевидно как без volatile и Atomic* можно такое гарантировать.Alexandr wrote:скажем так: всегда атомарно, если выравнен на границе слова. По умолчанию - это всегда так: что в C++ (до C++11 вообще понятия memory consistency model не существовало), что в C#, что в Javacrypto5 wrote:Что вы вкладываете в слово "могу"? инт на 32 разрядной платформе всегда атомарно читается? Или нужны какие то дополнительные телодвижения?Alexandr wrote: т.е. грубо говоря int на 32 разрядной платформе я могу атомарно записать и прочитать без всяких volatile и interlocked
но можно руками добиться того, чтобы оно не было выравнено правильно (один кусок будет на одной строке кеша, другой на другой), тогда для чтения или записи нужно выполнить 2 чтения (сейчас процессоры сами работают с невыравненными данными, скорее всего операция все равно не атомарна, так как пока читает сам процессор с одной строки, вторая может быть в кеше другого процессора и туда что-то пишут)
In vino Veritas!
-
- Уже с Приветом
- Posts: 3647
- Joined: 23 May 2010 15:10
Re: Индусские программисты и индусский код
прошу прощения, не виделИнтеррапт wrote:Да, про это я на прошлой странице уже написал ))Alexandr wrote: очень часто виделCode: Select all
return !!value;
-
- Уже с Приветом
- Posts: 19041
- Joined: 11 Jan 2012 09:25
- Location: CA
Re: Индусские программисты и индусский код
А мне очень понравилось код оптимизировать на предмет memory efficiency.
WeakReference SoftReference, ThreadLocal ...
ах
WeakReference SoftReference, ThreadLocal ...
ах
https://www.youtube.com/watch?v=wOwblaKmyVw
-
- Уже с Приветом
- Posts: 3647
- Joined: 23 May 2010 15:10
Re: Индусские программисты и индусский код
как? кеш именно и проектировался таким образом, чтобы быть "невидимым" программисту.crypto5 wrote:Для процессора может и пофиг, а на возможные результаты выполнения программы это сильно влияет.
Когда попадет из регистра в кеш и в основную память никак не влияет на результаты выполнения программы, ну т.е. совсем
(естественно, я не говорю о производительности и так далее)
Last edited by Alexandr on 30 Jan 2013 23:01, edited 1 time in total.
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Индусские программисты и индусский код
Вы ж мой хороший! Вы видели абсолютно все джавы, правда? Даже те, которые еще не выпущены?Alexandr wrote:Вы ж мой хороший, в Java (как и в C#) примитивные данные изначально всегда (аллокатор любит это делать) выравнены как надо,АццкоМото wrote:Смотреть на выделенное и фтыкать тут: http://lurkmore.to/%D0%92%D0%B7%D0%B0%D ... 1%84%D1%8BAlexandr wrote: поспоришь, в Java, как и в C#, как и в C++, всегда можно атомарно прочитать или записать, если размер типа меньше либо равен разрядности шины (проще говоря, размеру регистра), если правильно выравнено, что для простых типов всегда так и для C++ и для C# и для Java. (правда в отличии от C++ на C# и Java long не гарантирован atomic, чтобы не было разницы между 32 разрядной JVM и 64 разрядной)
т.е. грубо говоря int на 32 разрядной платформе я могу атомарно записать и прочитать без всяких volatile и interlocked
конечно операции: чтение + последующая запись, чтение + изменение + запись не атомарны
а вот если руками лезть (типа Layout.Explicit и Offset в структурах на C# ставить), то можно и кое-что сломать
Нет никакого секретного свойства в джаве, которое бы гарантировало атомарность даже самого банальнейшего присваивания. Я даже не буду пытаться аргументировать, это просто факт.
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Индусские программисты и индусский код
Ну вот в примере выше один поток может не увидеть изменения сделанные в другом потоке, потому что они происходят в кеше проца, регистре и т.д. А если поставить volatile и все изменения сразу записываются в основную память, то второй поток все увидит.Alexandr wrote:как? кеш именно и проектировался таким образом, чтобы быть "невидимым" программисту.crypto5 wrote:Для процессора может и пофиг, а на возможные результаты выполнения программы это сильно влияет.
Когда попадет из регистра в кеш и в основную память никак не влияет на результаты выполнения программы
(естественно, я не говорю о производительности и так далее)
In vino Veritas!
-
- Уже с Приветом
- Posts: 3647
- Joined: 23 May 2010 15:10
Re: Индусские программисты и индусский код
ути-утиАццкоМото wrote:Вы ж мой хороший! Вы видели абсолютно все джавы, правда? Даже те, которые еще не выпущены?Alexandr wrote:Вы ж мой хороший, в Java (как и в C#) примитивные данные изначально всегда (аллокатор любит это делать) выравнены как надо,АццкоМото wrote:Смотреть на выделенное и фтыкать тут: http://lurkmore.to/%D0%92%D0%B7%D0%B0%D ... 1%84%D1%8BAlexandr wrote: поспоришь, в Java, как и в C#, как и в C++, всегда можно атомарно прочитать или записать, если размер типа меньше либо равен разрядности шины (проще говоря, размеру регистра), если правильно выравнено, что для простых типов всегда так и для C++ и для C# и для Java. (правда в отличии от C++ на C# и Java long не гарантирован atomic, чтобы не было разницы между 32 разрядной JVM и 64 разрядной)
т.е. грубо говоря int на 32 разрядной платформе я могу атомарно записать и прочитать без всяких volatile и interlocked
конечно операции: чтение + последующая запись, чтение + изменение + запись не атомарны
а вот если руками лезть (типа Layout.Explicit и Offset в структурах на C# ставить), то можно и кое-что сломать
Нет никакого секретного свойства в джаве, которое бы гарантировало атомарность даже самого банальнейшего присваивания. Я даже не буду пытаться аргументировать, это просто факт.
Variables shared between multiple threads (e.g., instance variables of objects) have atomic assignment guaranteed by the Java language specification for all data types except longs and doubles.
-
- Уже с Приветом
- Posts: 4205
- Joined: 10 Jan 2004 01:22
- Location: n-sk -> MD -> VA
Re: Индусские программисты и индусский код
точно! в жизни гораздо больше помогает попытка понять мотивацию автора. укрепляет потенц.карму, улучшает отношения с людьми. и как следствие AGI в налоговой декларации.valchkou wrote:почти на каждый приведенный пример якобы индуского кода нашлось аргументированое обоснование русского программиста.Интеррапт wrote:Ну вы как-то предметней что-ли расскажите, кем же этот код написан.valchkou wrote:почитав посты, создается ощущение, что весь этот индусский код написан совсем не индусами
а вам так не показалось?
в догонку: может не работать для фуллтаймеров в краткосрочной перспективе.
-
- Уже с Приветом
- Posts: 3647
- Joined: 23 May 2010 15:10
Re: Индусские программисты и индусский код
это регулируется спецификацией модели памяти процессора и могут быть связаны далеко не только очередностью помещения в кеш, загрузку в регистр; это также может быть связано с pipeline процессора, может быть еще с чем-тоcrypto5 wrote:Ну вот в примере выше один поток может не увидеть изменения сделанные в другом потоке, потому что они происходят в кеше проца, регистре и т.д. А если поставить volatile и все изменения сразу записываются в основную память, то второй поток все увидит.Alexandr wrote:как? кеш именно и проектировался таким образом, чтобы быть "невидимым" программисту.crypto5 wrote:Для процессора может и пофиг, а на возможные результаты выполнения программы это сильно влияет.
Когда попадет из регистра в кеш и в основную память никак не влияет на результаты выполнения программы
(естественно, я не говорю о производительности и так далее)
я и говорил, что нужно смотреть только на спецификацию модели памяти, остальное пофигу
-
- Уже с Приветом
- Posts: 15242
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Индусские программисты и индусский код
volatile никак не поможет скинуть процессорный кэш в основную память или там записать туда минуя процессорный кэшcrypto5 wrote:потому что они происходят в кеше проца, регистре и т.д. А если поставить volatile и все изменения сразу записываются в основную память, то второй поток все увидит.
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Индусские программисты и индусский код
Это не совсем так.АццкоМото wrote: Нет никакого секретного свойства в джаве, которое бы гарантировало атомарность даже самого банальнейшего присваивания. Я даже не буду пытаться аргументировать, это просто факт.
Java spec (JLS) гарантирует, что
- Присваивание ссылок - атомарное.
- Присваивание типов int, char, byte, short, boolean, float - атомарное.
- Присваивание double и long с volatile модификатором - атомарное.
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Индусские программисты и индусский код
Не может, но в джаве оно определяет happens before relation, т.е. гарантируется что присвоение X = 1 увидит второй поток прежде чем первый начнет выполнять if(Y == 1), и тогда два нолика никогда не случатся.АццкоМото wrote:volatile никак не поможет скинуть процессорный кэш в основную память или там записать туда минуя процессорный кэшcrypto5 wrote:потому что они происходят в кеше проца, регистре и т.д. А если поставить volatile и все изменения сразу записываются в основную память, то второй поток все увидит.
Как это делается на разном железе я ХЗ, я не железячник.
In vino Veritas!
-
- Уже с Приветом
- Posts: 12257
- Joined: 20 Dec 2000 10:01
- Location: Bellevue, WA
Re: Индусские программисты и индусский код
найти пример мульти-процессора с sequential consistency я не смог хотя в теории они должны существовать, но по поводу джавы вот тут хорошо излагают
http://bartoszmilewski.com/2008/11/11/w ... nsistency/
http://bartoszmilewski.com/2008/11/11/w ... nsistency/
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Индусские программисты и индусский код
Да, это то о чем я тут толкую..Dweller wrote:найти пример мульти-процессора с sequential consistency я не смог хотя в теории они должны существовать, но по поводу джавы вот тут хорошо излагают
http://bartoszmilewski.com/2008/11/11/w ... nsistency/
In vino Veritas!
-
- Уже с Приветом
- Posts: 2305
- Joined: 14 Apr 1999 09:01
- Location: Ural->CA
Re: Индусские программисты и индусский код
Сабине , сеичас разрыдаюсь от нахлынувших воспоминаний(или от смеха)Сабина wrote:Там три раза было на самом деле
Alcohol, Tobacco, Firearms, and Explosives. The makings of a great weekend in West Virginia!