|
|
| Посл.отвђт | Сообщен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 |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.285 |