2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4  След.
 
 
Сообщение22.11.2008, 02:52 


12/09/08

2262
Pavia в сообщении #160765 писал(а):
Не верно. Есть строгии правила MEMORY ORDERING которые не позволяют в мульти процесорных системах переставлять обращения к памяти как захочиться. Возьмити маны и почитайте.
А мужики то и не знают. Вы всех, кто толкует про мемори-барьеры отправляйте маны читать, ага.

 Профиль  
                  
 
 
Сообщение22.11.2008, 02:59 
Аватара пользователя


26/02/06
179
Хижина дяди Тома
вздымщик Цыпа писал(а):
Ну так как Вы оцениваете шансы на такое?


С ходу ответ такой: без специальных усилий внутри функции f(), такое вряд ли возможно. Но буду подумать.

Добавлено спустя 3 минуты 36 секунд:

Pavia писал(а):
Есть строгие правила MEMORY ORDERING которые не позволяют в мульти процессорных системах переставлять обращения к памяти как заточиться. Возьмите маны и почитайте.


Вы бы ребят из Intel или AMD туда послали. Ну в смысле в библиотеку.

 Профиль  
                  
 
 
Сообщение22.11.2008, 03:02 
Аватара пользователя


31/10/08
1244
вздымщик Цыпа
Цитата:
In a multiple-processor system, the following ordering rules apply:
• Individual processors use the same ordering rules as in a single-processor
system.
• Writes by a single processor are observed in the same order by all processors.
• Writes from the individual processors on the system bus are NOT ordered with
respect to each other.
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A
Грубый перевод. Для одного процессора в мульти процессорной системе запись идет по попорядку. А вот с разных процессоров нет.

Цитата:
Generally, out-of-order writes are not allowed.
AMD
Как правлио, выход из порядка записи не допускается.
Далее потексту исключением является Write combining. Но там специальные инструкции.

Что касается компилятора, то это на них нужно смотреть описание. Но теоретически он тоже не должен этого делать.

 Профиль  
                  
 
 
Сообщение22.11.2008, 03:03 
Аватара пользователя


26/02/06
179
Хижина дяди Тома
Сейчас - поздно, но завтра-послезавтра выложу отрывочек из одной занимательной книжонки на эту тему.

 Профиль  
                  
 
 
Сообщение22.11.2008, 03:20 


12/09/08

2262
Pavia в сообщении #160770 писал(а):
Грубый перевод. Для одного процессора в мульти процессорной системе запись идет по попорядку.
Это слишком грубый перевод ;) Правильный перевод такой: каждый процессор использует такой способ записи, как если бы он был один в системе. Т.е. каждых процессор делает то, что ему вздумается без оглядки на остальных. Если брать пример интел, то в нем нет копирования память-память, только память-регистр и регистр-память. Потому встретив последовательность инструкций:

читать из b в регистр
писать регистр в x
писать констатнту в a

он легко параллелит «читать из b в регистр» и «писать констатнту в a» и причем запрос на «читать» вполне может испониться позже, чем запрос на «писать».

 Профиль  
                  
 
 
Сообщение22.11.2008, 03:30 
Аватара пользователя


31/10/08
1244
Цитата:
Это слишком грубый перевод Правильный перевод такой: каждый процессор использует такой способ записи, как если бы он был один в системе.
Одну строчку ты перевел, теперь переведи следующую.

Цитата:
он легко параллелит «читать из b в регистр» и «писать констатнту в a» и причем запрос на «читать» вполне может испониться позже, чем запрос на «писать».

Там куча правил. Если бы было так то он бы вообще не занес бы ничего в x.

 Профиль  
                  
 
 
Сообщение22.11.2008, 03:39 


12/09/08

2262
Pavia в сообщении #160774 писал(а):
Одну строчку ты перевел, теперь переведи следующую.
Хочу заметить, что на данном форуме такая форма обращения не принята. В остальных строчках нет ничего, что этому бы противоречило.
Pavia в сообщении #160774 писал(а):
Если бы было так то он бы вообще не занес бы ничего в x.
Это почему же?

 Профиль  
                  
 
 
Сообщение22.11.2008, 05:09 
Аватара пользователя


31/10/08
1244
вздымщик Цыпа
Цитата:
Если бы было так то он бы вообще не занес бы ничего в x.
Это почему же?

Потому что он должен записать в x, прежде чем запишет в a.
3. Writes to memory are always carried out in program order, with the exception of
writes executed with the CLFLUSH instruction and streaming stores (writes)
executed with the non-temporal move instructions (MOVNTI, MOVNTQ,
MOVNTDQ, MOVNTPS, and MOVNTPD).
3. Запись в память всегда выполняется в порядке программы, за исключением записи выполняемых при CLFLUSH инструкции и потоковых stores (записей) выполняемых при non-temporal move инструкций (MOVNTI, MOVNTQ, MOVNTDQ, MOVNTPS, и MOVNTPD).

Следовательно в x попала бы чушь. Это получается, что перемещении из памяти в память ничего бы не работало. Ну это же не так. А все потому что есть еще правило.


2. Reads can pass buffered writes, but the processor is self-consistent.
2. чтения могут пропустить buffered writes, но процессор является самосогласованным.
Это значит что чтение самосогласовывается с записью. Если бы чтение и запись были бы не согласующимися, то запись могла произойти раньше. А так как они взаимно связанные то чтение не пропустит запись вперед себя.

The second rule allows a read to pass a write. However, if the write is to the same
memory location as the read, the processor’s internal “snooping” mechanism will
detect the conflict and update the cached read before the processor executes the
instruction that uses the value.
Второе правило позволяет чтению пропускать записывание. Как бы то ни было, если запись в туже самую область что и чтение, процессорный внутренний механизм “отслеживания” выполняет определение конфликта и обновляет кеш чтения до того как процессор запустит инструкцию которое будет использовать данное значение.

 Профиль  
                  
 
 
Сообщение22.11.2008, 10:49 
Аватара пользователя


26/02/06
179
Хижина дяди Тома
Вот интересная и познавательная табличка:
Изображение,

а вот ссылка на всю статью: Memory Ordering in Modern Microprocessors.

Делайте выводы. Говоря словами Винни-Пуха: От этих пчел, всего можно ожидать

 Профиль  
                  
 
 
Сообщение22.11.2008, 13:04 


19/11/08
347
Фома писал(а):
В этом главное заблуждение. Дело в том, что с точки зрения процессора и компилятора (тот и другой не в курсе Ваших потоков) команды 1) и2) или 3) и 4) независимы. Поэтому они считают себя в праве переставить очередность их выполнения из своих соображений эффективности выполнения. :D

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

 Профиль  
                  
 
 
Сообщение22.11.2008, 13:37 
Аватара пользователя


26/02/06
179
Хижина дяди Тома
Андрей АK писал(а):
Вообще-то я имел ввиду то, что последовательность выполнения команд процессор может поменять только после того, как он загрузил пул этих команд для выполнения.
В этом случае он их выполнит все и пока не выполнит загруженные в кэш команды, никаких прерываний он выполнять не будет.
А если не будет прерываний, то и не будет передачи управления другому процессу и следовательно та последовательность выполнения ,что вы привели, невозможна.


Вы не правы. Два потока выполняются одновременно. Иначе какой смысл в многоядерности?

 Профиль  
                  
 
 
Сообщение22.11.2008, 14:02 


19/11/08
347
Фома писал(а):
Вы не правы. Два потока выполняются одновременно. Иначе какой смысл в многоядерности?

Не знаю, как выполняются потоки двумя ядрами ... но логика подсказывает, что если бы они выполнялись настолько одновременно, то их синхронизация была бы невозможна.
А без синхронизации терялся бы весь смысл многопоточности - большинство программ просто перестало бы работать.

 Профиль  
                  
 
 
Сообщение22.11.2008, 14:14 
Аватара пользователя


26/02/06
179
Хижина дяди Тома
Андрей АK писал(а):
Не знаю, как выполняются потоки двумя ядрами ... но логика подсказывает, что если бы они выполнялись настолько одновременно, то их синхронизация была бы невозможна.
А без синхронизации терялся бы весь смысл многопоточности - большинство программ просто перестало бы работать.


Дык есть специальные средства синхронизации. Но это ложиться на бедную (иногда опухшую ) :D голову программиста. В C#, например (и не только), есть такой оператор volatile, который, кстати, не нравится многим программистам.Есть целый класс Interlocked c целой серией методов чтения и записи в память и т.д.

Весь смысл моего поста в том, чтобы обратить внимание на то, как сильно меняется мир с появлением новых процессоров. Меняется парадигма программирования. Многое, ставшее привычным, становится просто не верным.

 Профиль  
                  
 
 
Сообщение22.11.2008, 14:21 


12/09/08

2262
Фома в сообщении #160853 писал(а):
Многое, ставшее привычным, становится просто не верным.
Да. Кто бы мог подумать, что инлайновые функции станут вредны. Кстати, как Вы думаете, почему?

 Профиль  
                  
 
 
Сообщение22.11.2008, 14:42 


19/11/08
347
Фома писал(а):
Дык есть специальные средства синхронизации. Но это ложиться на бедную (иногда опухшую ) :D голову программиста. В C#, например (и не только), есть такой оператор volatile, который, кстати, не нравится многим программистам.Есть целый класс Interlocked c целой серией методов чтения и записи в память и т.д.

Весь смысл моего поста в том, чтобы обратить внимание на то, как сильно меняется мир с появлением новых процессоров. Меняется парадигма программирования. Многое, ставшее привычным, становится просто не верным.

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 54 ]  На страницу Пред.  1, 2, 3, 4  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group