Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2016, 19:02   #11
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
lock требуется для инструкций типа XCHG поскольку они выполняют и чтение и запись.
Цитата:
Сообщение от Pavia Посмотреть сообщение
Код:
lock  XCHG  DWord PTR [mutex],edx
xchg лочить не нужно (хоть и можно), она всегда выполняется с блокировкой шины. Это единственная инструкция с такой особенностью. Это прописано в мануалах и к Intel, и к AMD. А вот cmpxchg, cmpxchg8b, inc, sub и пр. надо.

Цитата:
Сообщение от Pavia Посмотреть сообщение
Думаю что можно и он сработает.
Цитата:
Сообщение от waleri Посмотреть сообщение
Собственно lock можно выполнять с любой инструкцией, только смысла нет. lock посылает всем остальным процессорам сигнал "всем ждать, пока я закончу". Соотвественно lock инструкция блочится, пока остальные процы не скажут "мы ждем, о повелитель".
Не с любой. И с mov не сработает, об этом в гайдах прямым текстом написано (да и я проверил сейчас для надёжности, выделает исключение)

Мне вот непонятно, кстати, нафига функция InterlockedExchange использует
Код:
@: mov eax,[ecx]
   lock cmpxchg [ecx],edx
   jnz @
вместо простого xchg? Зачем такой бред делать?
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru

Последний раз редактировалось 7in; 19.09.2016 в 19:05.
7in вне форума Ответить с цитированием
Старый 19.09.2016, 19:56   #12
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

С cmpxchg код короче.

Код:
procedure SpinMutexDoLock(const Mutex:PMutex);
assembler;
asm
@spin_loop:
  MOV   edx,1
  lock  XCHG  DWord PTR [mutex],edx
  OR    edx,edx
  JZ    @lock_success
  wait
  JMP   @spin_loop
@lock_success:
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 19.09.2016, 20:15   #13
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Вопрос не в этом. А почему ребята из MS не использовали xchg? Будем считать это их чудачеством.

А по коду не комильфо лочить шину постоянно.
Код:
  mov edx,1
  jmp @try2lock
@spin_loop:
  pause
  cmp dword ptr [mutex],0
  jnz @spin_loop
@try2lock:
  xchg dword ptr [mutex],edx
  or edx,edx
  jnz @spin_loop
p.s. И wait - это немного другая история...
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru

Последний раз редактировалось 7in; 19.09.2016 в 20:27.
7in вне форума Ответить с цитированием
Старый 19.09.2016, 21:51   #14
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
MS не использовали xchg?
Используют. http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Ребята из МС очень странные. Мьютексы выравнивают на границе 16 байт. Они даже спинлоки патчели на лету, не знаю как сейчас.
Думаю раз статей нет то и принципиальной разницы никто и не искал.
У менеджера критические дни наступили вот и поменяли.

Цитата:
А по коду не комильфо лочить шину постоянно.
Начиная с P6 шина не лочится. Лочится только кэш.

wait она есть везде, а pause только на современных. А по сути нужно вставить небольшую паузу для разрыва. Так что принципиальной разницы нет. wait конечно греет процессор сильнее чем pause, но мне совместимость показалась важнее.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 19.09.2016, 22:06   #15
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Код:
@spin_loop:
  pause
  cmp dword ptr [mutex],0
  jnz @spin_loop
Я боюсь что такой цикл может оказаться бесконечным. Для ускорения в интеле реализованы короткие циклы. А данные вполне могут не выгружаться в кэш и не загружаться из него, а тупа сидеть в порут отвечающем за load и store.
Т.е гипотетически возможно что загрузка из кэша может происходить перед циклом и выгрузка после цикла, но не во время.
Первое аппаратное прерывание разорвёт цикл, но они не такие частые от 300 до 3 000 Гц.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 19.09.2016 в 22:10.
Pavia вне форума Ответить с цитированием
Старый 19.09.2016, 23:09   #16
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от 7in Посмотреть сообщение
не сработает, об этом в гайдах прямым текстом написано
Я тестировал лет 20 назад, так что такие подробности уже не помню...
waleri вне форума Ответить с цитированием
Старый 20.09.2016, 10:19   #17
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Я боюсь что такой цикл может оказаться бесконечным. Для ускорения в интеле реализованы короткие циклы. А данные вполне могут не выгружаться в кэш и не загружаться из него, а тупа сидеть в порут отвечающем за load и store.
Это код, рекомендованный Intel'ом, не думаю, что там такие косяки будут. Тем более, они пишут, что pause как раз оптимизирует работу с памятью на spin-loop'ах.

Цитата:
Сообщение от Pavia Посмотреть сообщение
wait она есть везде, а pause только на современных. А по сути нужно вставить небольшую паузу для разрыва. Так что принципиальной разницы нет. wait конечно греет процессор сильнее чем pause, но мне совместимость показалась важнее.
pause совместима со старыми процессорами, только она там ничего не будет делать, потому что это rep nop
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объяснение. операторы присвоения.С valodu Помощь студентам 7 12.03.2016 04:54
перегрузка операции присвоения (С++) Sterben Помощь студентам 2 11.10.2015 21:01
Формула присвоения (дописывание текста из ячейки) SweetOpium Microsoft Office Excel 0 28.02.2013 15:53
алгоритм присвоения минимального значения max_scotch Помощь студентам 3 11.05.2012 19:25
последовательность присвоения значения переменным Maincore Общие вопросы Delphi 2 06.02.2012 13:10