· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Синхронизация

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Июл 25, 2004 06:56:26

Какую надо использовать инструкцию процессора чтобы за 1 такт инкрементировать переменную, поменять значения переменной и регистра?
Возможно ли это из пользоватетьского режима?
Какие особенности для мультипроцессорных систем?


Дата: Июл 26, 2004 01:49:05

инкрементировать inc
поменять xchg
только для конвейерной обработки, которая в пнях присутствует, понятие тактов несколько условно.
Все непривелигированные команды процессора выполняются одинаково как в режиме пользователя, так и в режиме ядра. А привилигированные в режиме пользователя просто вызывают исключение. Для MP систем разница в том, что нужно лочить шину данных если к памяти обращаешься. xchg, вроде по любому это делает, а для инкрементирования, так:
lock inc [address]

ЗЫ: Давненько я всё это читал - могу напутать чего.


Дата: Июл 26, 2004 01:53:36 · Поправил: Asterix

> поменять xchg

Если верить Агнеру то
xchg память, регистр
очень медленна, в один такт наверно не уложится ;-)


Дата: Июл 26, 2004 05:20:31

Если верить товарищу Intel'у, то среднее время выполнения xchg - 1,5 такта


Дата: Июл 26, 2004 05:41:55

Mayor
Не вижу связи между "1 такт" и сабжем.


Дата: Июл 26, 2004 06:53:02

jekyll
26.1 XCHG (all processors)

The XCHG register,[memory] instruction is dangerous. By default this instruction has
an implicit LOCK prefix which prevents it from using the cache. This instruction is
therefore very time consuming, and should always be avoided.


26.1 XCHG (все процессоры) 

Инструкция 'XCHG регистр, [память]' опасна. По умолчанию эта инструкция имеет неявный
префикс LOCK, что не дает ей загружаться в кэш. Поэтому выполнение данной инструкции
отнимает очень много времени, и ее следует избегать.


Дата: Июл 26, 2004 07:35:49

Возможно, Mayor хочет что-то вроде мютекса реализовать, так что тут префикс LOCK как нельзя кстати.
Кстати, :) тема такая была, Edmond приводил примеры работающего кода с объяснениями - поищите.


Дата: Июл 26, 2004 07:41:06

Asterix
Спасиба за перевод, но что то я в своих мануалах этого не нашел. Можно ссылку а-ля том - страница?


Дата: Июл 26, 2004 12:46:00

> Спасиба за перевод

Это не мой, это Aquil'ы :-)

> что то я в своих мануалах этого не нашел

Это Агнер Фог.


Дата: Июл 26, 2004 14:00:48

jekyll
Кстати
xchg eax, [memory]
у меня занимает ~ 20 тактов!


Дата: Июл 26, 2004 14:08:33

Если тебе нужны критические секции в коде, то используй что-то вроде такого:
.data
flag  db 0
.code
      ;...
enter_critical_section:
      ;...
      mov al,1
      xchg [flag],al
      cmp al,1
      je enter_critical_section
do_somethig_we_are_alone:
      ;...
leave_citical_section:
      mov [flag],0
      ;...


Главное не забывать использовать префикс lock, так как он блокирует шину, и не дает ее другим процессорам нга время работы команды. Команда xchg выставляет lock сама.

И для общего развития (что-бы #UD не схлопотать):

Префикс LOCK функционирует исключительно со следующими командами: ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD и XCHG, причем один из их операндов должен непременно находится в памяти.

Бай.


Дата: Июл 27, 2004 06:40:20

Asterix
А что за проц у тебя?


Дата: Июл 27, 2004 07:21:19

Asterix
„xchg eax, [memory]
у меня занимает ~ 20 тактов!“


Дык это сильно зависит есть ли содержимое [memory] в кеше или нет..


Дата: Июл 27, 2004 12:54:01

jekyll
Athlon 1133


Дата: Июл 27, 2004 13:03:30

Кто хочет может попробовать и напишите здесь что в MessageBox'е написало ;-)
У меня получается 24 и 6, т.е. скорее всего 18 тактов занимает xchg eax, [memory].

1109439663__TimeTest.exe

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.285