vak: (Default)
[personal profile] vak
Берем простой, хотя и нетривиальный си-шный код, и сравниваем количество получившихся машинных команд. Компилятор 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-процессорам.

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

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

Date: 2007-05-24 22:02 (UTC)
From: [identity profile] spamsink.livejournal.com
А теперь берем старый добрый 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?

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

Не верю. Насколько я понимаю, предсказанный переход на адрес, который уже во внутреннем представлении - бесплатный, да и суперскалярность никто не отменял. Ну и -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

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

Интел

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

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

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

Разные MIPS

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

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

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

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

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

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

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

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

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

Re За красоту

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

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

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

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

Date: 2008-02-12 08:22 (UTC)
From: [identity profile] troosh.livejournal.com
На 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-х тактный цикл...

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

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

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/

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

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

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

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

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