vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2007-05-25 01:08 am

Сравнение архитектур процессоров

Берем простой, хотя и нетривиальный си-шный код, и сравниваем количество получившихся машинных команд. Компилятор GCC 4.1.2, оптимизация -O1. Исходный код такой:
unsigned long rot13_hash (unsigned char *str, unsigned int len)
{
unsigned long hash = 0;

while (len-- > 0) {
hash += *str++;
hash -= (hash << 13) | (hash >> 19);
}
return hash;
}
Результаты:

АрхитектураКоманд в циклеВсего команд
ARM613
Thumb817
MIPS32917
Intel 386925
MIPS161017
Blackfin1122

Для MIPS и Blackfin компилятор не догадался заменить два арифметических сдвига на один циклический. Предположим, мы исправили компилятор. Тогда получится так:

АрхитектураКоманд в циклеВсего команд
ARM613
MIPS32715
MIPS16815
Thumb817
Blackfin819
Intel 386925

Хорошо видно, насколько архитектура Intel 386, она же Pentium, проигрывает RISC-процессорам.

[identity profile] panchul.livejournal.com 2007-05-24 09:42 pm (UTC)(link)
Ох, Сережа, ты бы испытал большой кайф, если бы работал в Microtec Research, где я работал в 1995-м году (их потом скушал Mentor Graphics). У Microtec Research были симуляторы, компиляторы и рт-осы для кучи процессоров, включая довольно извратные. Это был (до съедения его MGC) мировой лидер в тулах для embedded systems (после съедения он почти исчез с рынка). Офис был в треугольном здании сразу рядом с Интелом (почти стенка к стенке (кстати, я сейчас хожу в гнусный Интел по поводу проекта верификационой модели графической памяти))). Из моего офиса в Microtec Research окрывался шикарный вид Силиконовой Долины. Здание было, как я уже сказал, в виде треугольной призмы, что вызывало первые пару недель ощущение шизофрении (идешь по коридору, повернул раз, повернул два - и вдруг ты в той же точке, откуда начал). Там я губил свою молодость, играясь с моделями этих процессоров ;-)

[identity profile] spamsink.livejournal.com 2007-05-24 09:52 pm (UTC)(link)
Какая разница, сколько команд? Ты бы с тем же успехом русский язык с английским сравнивал по количеству слов (ах, в английском столько лишних артиклей!). Главное - сколько байт занимают все эти команды (нагрузка на I-Cache) и сколько тактов они исполняются.

[identity profile] spamsink.livejournal.com 2007-05-24 10:11 pm (UTC)(link)
одна команда исполняется за один такт

Не верю. Насколько я понимаю, предсказанный переход на адрес, который уже во внутреннем представлении - бесплатный, да и суперскалярность никто не отменял. Ну и -Os тоже никто не отменял:
rot13_hash:
        xorl    %edx, %edx
.L7:
        decl    %esi
        cmpl    $-1, %esi
        je      .L6
        movzbl  (%rdi), %eax
        incq    %rdi
        addl    %eax, %edx
        movl    %edx, %eax
        roll    $13, %eax
        subl    %eax, %edx
        jmp     .L7
.L6:
        movl    %edx, %eax
        ret

[identity profile] thesz.livejournal.com 2007-05-25 08:33 am (UTC)(link)
На интеле она выполняется менее, чем за такт. Либо более, чем за два. ;)

Кстати, i386 ты тоже поставил циклический сдвиг, или нет?

Теперь - про размер команд. CISC почти в два раза компактней, чем RISC. VLIW, соответственно, в два раза хуже RISC, а TTA - вдвое хуже VLIW. ;)

Правда, не на этом, твоем специально подобранном коде. ;)

[identity profile] golosptic.livejournal.com 2007-06-12 01:41 pm (UTC)(link)
Сравнение естественных языков по такому принципу имеет вполне конкретный практический смысл.

[identity profile] spamsink.livejournal.com 2007-05-24 10:02 pm (UTC)(link)
А теперь берем старый добрый GCC 3.4.3 для x86_64, заменяем unsigned long на unsigned и получаем 15 команд, из них 9 в цикле:
rot13_hash:
        movl    $0, %edx
        decl    %esi
        cmpl    $-1, %esi
        je      .L6
.L4:
        movzbl  (%rdi), %eax
        addl    %eax, %edx
        incq    %rdi
        movl    %edx, %eax
        roll    $13, %eax
        subl    %eax, %edx
        decl    %esi
        cmpl    $-1, %esi
        jne     .L4
.L6:
        movl    %edx, %eax
        ret


Now what?

[identity profile] spamsink.livejournal.com 2007-05-24 10:14 pm (UTC)(link)
Я тебя умоляю. Все эти страшненькие x86 командочки декодируются с переименованием регистров во внутреннее трехадресное представление и исполняются (одновременно, если готовы и если есть ресурс) за столько тактов, сколько нужно именно этому представлению, а не сколько там было оригинальных команд.

[identity profile] http://users.livejournal.com/_kalle_/ 2007-05-25 07:34 am (UTC)(link)
Ну, вышеприведенный пример, по крайней мере, объясняет происхождение слова "Децл" Image

/* Яндекс на запрос "decl" выдает:
"Translit? Возможно, имелось в виду: «децл» " */

Интел

[identity profile] chtovimenitebe.livejournal.com 2007-05-25 07:32 am (UTC)(link)
Фи!
БОРЦЫ ПРОТИВ АРХИТЕКТУРНЫХ ИЗЛИШЕСТВ!

Re За красоту

[identity profile] chtovimenitebe.livejournal.com 2007-05-25 05:42 pm (UTC)(link)
Звучит красиво, но не работает.
За рынок!

Разные MIPS

[identity profile] skolk.livejournal.com 2007-05-25 08:18 am (UTC)(link)
В базовом наборе команд MIPS _нет_ циклического сдвига.
Он есть только в SmartMIPS Crypto и MIPS32 Release 2.
Поэтому, нужен был -march...

И в старых встроенных ядрах, его, по-моему, нет.
Есть ли он в Lexra, это для меня вопрос...

[identity profile] skolk.livejournal.com 2007-05-25 11:21 am (UTC)(link)
А теперь время смотреть доку на конкретное ядро, и выяснять, какой там MIPS. А разительная разница проявляется на S-boxes, а не на группе сети Фейстеля (может, Файштеля правильно?) ...

Кстати, Ваш хэш в идеале должен бы питаться не байтами, а словами...
Для Вашего теста padding некритичен, можно 0-ями.

[identity profile] panchul.livejournal.com 2007-05-25 05:13 pm (UTC)(link)
Колиснык! Сколько лет, сколько зим! (Точнее 20 лет, 20 зим)! Как жизнь молодая? Женился? Откуда Вакулеко знаешь? Чем занимаешься?

[identity profile] skolk.livejournal.com 2007-05-27 07:33 pm (UTC)(link)
Извиняюсь, все-все напутал.
Сеть Фейстеля построена, как положено, на чистом XOR.

Суммирование было перед S-boxes, а сдвиг после, но и его лучше к бинарному оператору сети не относить, поскольку он портит ассоциативность.

[identity profile] troosh.livejournal.com 2008-02-12 08:22 am (UTC)(link)
На E3M получается такой код:
0014<0000d0> HS    a0800412 M_d0:
             ALS3  e405c005  ldgdb,3,sm [ %b[5] + 0 ], %b[5]
             ALS5  90060706  adds,5,sm %b[6], %b[7], %b[6]
             ALES  01c00000
0015<0000e0> HS    80000401 :
             ALS5  9406cd08  scls,5,sm %b[6], 13, %b[8]
0016<0000e8> HS    e0001424 :
             SS    806f04a0  ct %ctpr1 ? #NOT_LOOP_END
                             abn abnf=1, abnt=1
                             abp abpf=1, abpt=1
                             alc alcf=1, alct=1
             ALS3  9003c101  adds,3,sm %b[3], 1, %b[1]
             ALS4  90c00303  adds,4,sm 0, %b[3], %b[3]
             ALS5  92060804  subs,5,sm %b[6], %b[8], %b[4]
             ----  00000000
Если компилировать с профилированием или указать перед циклом "#pragma loop count(1000)", то начинает применяться APB (array prefetch buffer):
0014<000218> HS    80000401 M_218:
             ALS5  90060505  adds,5,sm %b[6], %b[5], %b[5]
0015<000220> HS    80001412 :
             SS    80002000
             ALS5  9405cd07  scls,5,sm %b[5], 13, %b[7]
             AAS   00011001  movab,1 area = 0, ind = 0, am = 1, be = 0, %db[1]
0016<000230> HS    80011412 :
             SS    806f04a0  ct %ctpr1 ? #NOT_LOOP_END
                             abn abnf=1, abnt=1
                             abp abpf=1, abpt=1
                             alc alcf=1, alct=1
             ALS5  92050704  subs,5,sm %b[5], %b[7], %b[4] ? %pcnt0
             CDS0  50400000  rlp,cd00 %pcnt0, >alc5
Т.е. в обоих случаях получам 3-х тактный цикл...

[identity profile] troosh.livejournal.com 2008-02-12 12:40 pm (UTC)(link)
Да, он самый. На крышке стоит 1891ВМ4Я.
Документация есть, но она всё ещё не публичная,
хотя вроде были планы это изменить.

[identity profile] troosh.livejournal.com 2008-02-12 01:31 pm (UTC)(link)
Ага, жаль... Но думаю, что если какая контора попросит, то дадут нужную информацию. Во всяком случае уже столько народа со своими задачами приходили, что уже давно пора не усно всё пересказывать, а предоставлять готовую документацию для ознакомления. Хотя с другой стороны и не предполагается, что кто-то на стороне будет писать под Эльбрусы на asm. Время подвигов ушло. ;)

Оно работает. Даже прошли гос. испытания (http://www.mcst.ru/news.shtml#071029).

С Бабаяном лично знаком не был, так что позволю себе не комментировать последнее высказывание...

[identity profile] troosh.livejournal.com 2008-02-12 02:40 pm (UTC)(link)
Я так понимаю принят был процессор, машина на паре таких процессоров и весь софт под них. Должно быть доказали что соответствует ТЗ, я уж так подробно не вникал в это, - вроде явного негатива и проколов не было.

Понятно что сейчас мало кому нужно голое процессорное ядро, а E3M требует чипсета (северного моста), которого нет в кремнии, только в дорогом FPGA. Это основная проблема у E3M для вывода его на рынок. В этом году должны сделать E3S (кеш L2 не 256K, а уже 2М, два встроенных контроллера памяти и 3 межпроцессорных линка), - у него на много больше шансов быть реально востребованным.

[identity profile] troosh.livejournal.com 2008-02-12 12:46 pm (UTC)(link)
Вот ещё одно место, где сейчас придумывают "более лучший" хеш:

http://smallcode.weblogs.us/2008/01/22/hash-functions-an-empirical-comparison/
http://smallcode.weblogs.us/2008/02/04/hash-functions-additional-tests/
http://smallcode.weblogs.us/2008/02/12/hash-functions-part-3/