?

Log in

No account? Create an account
программистское - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

программистское [фев. 13, 2007|04:52 pm]
Anatoly Vorobey

Пишу на ассемблере! Просто чуть ли не "бойцы вспоминают минувшие дни".


       .text
.globl readcounter
readcounter:
        pushl   %ebx
        pushl   %ecx
        subl    %eax, %eax
        cpuid
        rdtsc
        pushl   %eax
        pushl   %edx
        subl    %eax, %eax
        cpuid
        popl    %edx
        popl    %eax
        popl    %ecx
        popl    %ebx
        ret
        .size   readcounter, .-counter
СсылкаОтветить

Comments:
[User Picture]From: alta_voce
2007-02-13 03:12 pm
В минувшие дни какой-то не такой ассемблер был.
(Ответить) (Thread)
[User Picture]From: avva
2007-02-13 03:12 pm
Что да то да :(
(Ответить) (Parent) (Thread)
[User Picture]From: alta_voce
2007-02-13 03:19 pm
Почему грустный смайлик?

Тот самый классический ассемблер я ненавидела, а другой известный тебе бывший программер очень даже любил.
(Ответить) (Parent) (Thread)
[User Picture]From: slobin
2007-02-13 03:19 pm
А я так и не выучил ассемблера защищённого режима. На реалмодовом 8086 писал довольно много. До этого на PDP-11 и совсем немножко на 360 и 8080.

... Эстетически мотивированное любопытство ...

(Ответить) (Thread)
[User Picture]From: avva
2007-02-13 03:22 pm
Намного проще, чем реалмод, надо сказать :) после того, как привыкнешь.
(Ответить) (Parent) (Thread)
[User Picture]From: slobin
2007-02-13 03:30 pm
Легко верю. Понимаете, реалмодовый я выучил спьяну. ;-) Нет, не бухой в зюзю, но после пятидесяти грамм водки. Просто после красивого и логичного PDP я откровенно боялся в ЭТО залезать, а так стало море по колено.

... She sells the seashells on the seashore ...

(Ответить) (Parent) (Thread)
From: vacuite
2007-02-13 03:23 pm
юзай насм, там интеловская семантика
(Ответить) (Thread)
[User Picture]From: avva
2007-02-13 03:27 pm
спасибо, мне своей головной боли хватает.
(Ответить) (Parent) (Thread)
[User Picture]From: aburachil
2007-02-13 03:29 pm

subl %eax, %eax

Это означает eax:=0 ? В наше время гламурнее было писать для этого "xor a" ;-)
(Ответить) (Thread)
[User Picture]From: avva
2007-02-13 03:33 pm

Re: subl %eax, %eax

Да, но sub готичнее, ведь он включает в себя глубокую мысль: "ибо прах ты и в прах возвратишься" (Бытие 3:19), а xor это что - так фигня какая-то побитовая.
(Ответить) (Parent) (Thread)
[User Picture]From: aburachil
2007-02-13 03:54 pm

глубокую мысль

ash to ash
bash to bash
(Ответить) (Parent) (Thread)
[User Picture]From: nice_beaver
2007-02-13 04:30 pm

Re: subl %eax, %eax

Ксор быстрее (во всяком случае, раньше был)
(Ответить) (Parent) (Thread)
[User Picture]From: comnimh
2007-02-18 11:15 pm

Re: subl %eax, %eax

Короче. И сейчас короче.
(Ответить) (Parent) (Thread)
[User Picture]From: potan
2007-02-13 05:07 pm

Re: subl %eax, %eax

У меня даже была гипотеза, что xor жрет меньше энергии, чем sub :-)
(Ответить) (Parent) (Thread)
[User Picture]From: ygam
2007-02-14 05:22 am
Энергию жрет стирание информации, а не вычисления.
(Ответить) (Parent) (Thread)
[User Picture]From: potan
2007-02-14 08:19 am
Это все философия.
Реально жрет энергию текущий по проводам ток и перезаряд емкостей.
В реализации вычитания проводов заметно больше, чем в реализации побитовых операций.
(Ответить) (Parent) (Thread)
[User Picture]From: ygam
2007-02-16 12:17 am
Я пошутил.
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2007-02-13 03:49 pm
Знаю, спасибо :)
(Ответить) (Parent) (Thread)
[User Picture]From: centralasian
2007-02-13 08:04 pm
это на самом деле мне юзерпик. он же нарисовал верблюда.
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2007-02-13 08:06 pm
Бери, если Соамо разрешит и ты хочешь. Мне он не очень понравился, увы (хотя вообще очень люблю его стиль).
(Ответить) (Parent) (Thread)
[User Picture]From: centralasian
2007-02-13 08:27 pm
а я ему там и намекнул, мол, можно ли менору на тюбетейку махнуть
(Ответить) (Parent) (Thread)
(Удалённый комментарий)
[User Picture]From: avva
2007-02-13 03:50 pm
Это AT&T синтаксис, его понимает gcc.
(Ответить) (Parent) (Thread)
From: (Anonymous)
2007-02-13 05:22 pm

Мне вот интересно,

а вот 64-разрядные регистры как сейчас называются? Особенно как выглядит программа для интелей (пусть и дуо).
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2007-02-13 05:30 pm
rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, and r15.

В общем, как обычно выглядит. eax это нижняя половина rax итд.
Основные инструкции те же.
(Ответить) (Parent) (Thread)
[User Picture]From: iratus
2007-02-13 04:00 pm
ну функция возвращает cpuid или артачится :)))
(Ответить) (Thread)
[User Picture]From: avva
2007-02-13 05:09 pm
вовсе нет :)
(Ответить) (Parent) (Thread)
[User Picture]From: unbe
2007-02-13 05:42 pm
А зачем второй cpuid?
(Ответить) (Thread)
[User Picture]From: avva
2007-02-13 05:50 pm
А зачем первый? Затем же.
(Ответить) (Parent) (Thread)
[User Picture]From: unbe
2007-02-13 06:15 pm
Это первое упоминание о втором cpuid, которое я увидел. Везде пишут, что надо только до. Зачем чистить OOO pipeline после?
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2007-02-13 06:27 pm
Потому что "нечестно", ведь сразу после первого запускается pipeline опять, и во время самого замера уже плетет свои гнусные сети со следующими инструкциями. Самое чистое решение - оборвать точку замера с двух сторон. Это даст самую чистую картину поведения. Конечно, с прагматической точки зрения второй обрыв далеко не так важен, как первый, это верно - что оно там успеет сделать, практически ничего.
Но как-то симметричнее и последовательнее так, по-моему. А что касается самих затрат, я все равно буду учитывать (примерные) затраты на cpuid при калибровке результатов, так какая уж разница, один раз или два.
(Ответить) (Parent) (Thread)
[User Picture]From: unbe
2007-02-13 07:08 pm
Я, конечно, не знаю, что именно и как нужно измерить, но мне кажется, второй cpuid сделает только хуже. Он не повлияет на численный результат (в eax:edx то же значение, что и было бы без него), а даст, по сути, только задержку уже после измерения, причем не постоянную, а плавающую. Где смысл? :)
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2007-02-13 08:01 pm
Идея в том, что результат тот же, но если вы после этого повторяете тот же процесс (который изначально замеряли), или еще что-нибудь, что хотите измерить, то разница между следующим значением и этим будет немножко нечестная, потому что CPU начал загружать все в pipelines, prefetch queues итд. итп. еще до того, как закончилась операция rdtsc. Ваше следующее измерение будет чуть меньше реального; подобно тому, как если бы вы не делали первый cpuid, это измерение могло быть меньше реального.
(Ответить) (Parent) (Thread)
[User Picture]From: unbe
2007-02-13 08:54 pm
Я понял, просто не согласен. OOO execution - это нормальный режим работы, и именно в нем получается "реальный" результат. После cpuid часть кода будет выполнена в ненормальных условиях, то есть, потенциально, с другой скоростью. Эта часть может быть из двух кусков - тот, что внутри readcounter, и тот, что снаружи. Первый можно попытаться скомпенсировать при расчетах, второй нельзя. Еще один cpuid просто удлинняет этот второй кусок, делая измерение менее точным.

Проще говоря, если даже в случае без 2го cpuid будет какое-то "убыстрение" (хотя неясно, относительно чего), то в случае с ним будем замедление, которое гораздо труднее учесть.

Против "подобно тому...": первый cpuid делается только чтобы избежать OOO исполнения самого rdtsc. OOO исполнения чего нужно избежать после rdtsc?

Извините, что так длинно :)
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2007-02-18 11:28 pm
Совершенно не надо извиняться. На самом деле спасибо, вы меня убедили :) уберу второй cpuid.
(Ответить) (Parent) (Thread)
[User Picture]From: malaya_zemlya
2007-02-14 02:11 am
Во-первых, RDTSC синхронизирует pipeline.
Во-вторых, задержка у него самого меняется 90 до 120 циклов в зависимости от знака зодиака и погоды на Марсе, так что абсолютной точности не добиться.

http://softwarecommunity.intel.com/ISN/Community/en-US/forums/thread/30226599.aspx
(Ответить) (Parent) (Thread)
From: shamany
2007-02-14 03:26 am
она вообще была недокументированной долго. а то, что задержка меняется, конечно, она же от конвейера зависит практически напрямую!
(Ответить) (Parent) (Thread)
[User Picture]From: malaya_zemlya
2007-02-14 05:02 am
Я имел ввиду, что второй CPUID тут мало что может поменять.
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2007-02-18 11:29 pm
Да, убедили :) эх, симметричнее было!
(Ответить) (Parent) (Thread)
[User Picture]From: madfire
2007-02-13 05:48 pm
at&t синтаксис придумали нечеловеки..
(Ответить) (Thread)
[User Picture]From: avva
2007-02-13 05:50 pm
Да :( никогда не привыкну, изверги.
(Ответить) (Parent) (Thread)
[User Picture]From: djuffin
2007-02-13 06:04 pm
Все у AT&T по-другому. То два плюсика к C дорисуют, то проценты к регистрам.
(Ответить) (Thread)
[User Picture]From: faceted_jacinth
2007-02-13 10:56 pm
О, я правильно понял, что делает этот код.

Разные Люди советуют всё-таки использовать АПИ (под виндой - QueryPerformanceFrequency/QueryPerformanceCounter), которые вешаются на какой-то другой счётчик, насколько я понял, потому что Есть Нюансы. Оно, конечно, гораздо тормознее (когда я мерял, вызов QueryPerformanceCounter занимал несколько тысяч тактов), но его ж и не нужно часто вызывать.

Из нюансов -- проблемы на многопроцессорных системах (рекомендуется выставлять аффинити тому треду, которому нужно это всё мерять и раздавать окружающим) и на некоторых мобильных процессорах, которые самопроизвольно роняют тактовую частоту при высоком айдл тайме.
(Ответить) (Thread)
[User Picture]From: avva
2007-02-18 11:28 pm
С мобильными процессорами я сам убедился забавным образом - чтобы проверить таймер, обернул им вызов сначала sleep(1), а потом usleep(1). Сон длиной в одну микросекунду дал правильную тактовую частоту процессора, а длиной в секунду - в три раза меньше, совершенно последовательно.

И про многопроцессоры понимаю. И про другие счетчики знаю, но спасибо все равно :) (но я в основном на линуксе запускать буду. но там тоже есть). Я в основном для самоудовлетворения, плюс все-таки для некоторых конкретных целей (сравнения нескольких разных алгоритмов на многих наборах исходных данных, причем алгоритмы бегут быстро, на однопроцессорной машине и в среднем намного быстрее, чем может переключиться контекст на другой тред - а такие редкие исключения можно убрать усреднением по медиане нескольких результатов; и все это для улучшения своего собственного понимания) хорошо подходит.
(Ответить) (Parent) (Thread)
[User Picture]From: ygam
2007-02-14 05:20 am
Кстати, ты написал memcached? Возможно, его будут использовать в Амазоне.
(Ответить) (Thread)
[User Picture]From: avva
2007-02-18 11:23 pm
Я написал. Если можешь рассказать подробнее, расскажи (можно письмом), любопытно. Если нет - тоже нормально. Последние 2 года я почти не занимался его развитием, хотя возможно вернусь к этому, если будет время.
(Ответить) (Parent) (Thread)
[User Picture]From: ygam
2007-02-19 01:16 am
Я просто подписан на внутреннюю рассылку caching-interest, и там обсуждаются сравнительные преимущества и недостатки одного inhouse пакета и memcached.
(Ответить) (Parent) (Thread)