LINUX.ORG.RU

Реализация SHA1 на С от Торвальдса обогнала реализацию на ассемблере от OpenSSL

 ,


0

0

В своём блоге небезызвестный программист Линус Торвальдс сообщает, что на его рабочей станции с процессором на ядре Nehalem его реализация SHA1 для git работает быстрее SHA1 из библиотек OpenSSL. Он отмечает, что это позволило отказаться от привязки к libcrypt и на несколько секунд увеличить результаты прохождения тестов. Причём он выделяет, что он писал на «почти кросс-платформенном ассемблере» С, в отличие от разработчиков OpenSSL, писавших на ассемблере.

В своей обычной манере Торвальдс отзывается о компиляторах ("...it turns out that getting good results from SHA1 really is mostly about trying to fight the compilers tendency to try to be clever" - "...ясно, что чтобы получить хорошую реализацию SHA1, надо бороться с тенденцией компиляторов быть самыми умными"), процессорных архитектурах («On my Nehalem machine (but not Netburst or Atom - poor fragile micro-architectures that they are)...» - «На моей машине с Nehalem (ни в коем случае не с Netburst или Atom - убогие хрупкие микро-архитектуры)...») и даже бибилиотеках, к которым привязывался git ("...I get rid of two silly runtime loadable libraries that git no longer needs" - "...Я избавился от двух глупых загружаемых библиотек времени исполнения, которые больше не нужны git")

>>> Подробности



Проверено: Shaman007 ()

Ответ на: комментарий от Led

> Ага, "сказал"... в лужу

что касается "в лужу" - тут у тебя нет конкурентов, я же привел список аналогов, и даже сейчас, когда нет надобности искать замену, есть рабочие ОС на Linux без GNU - например Android

lester ★★★★
()
Ответ на: комментарий от lester

кстати код libc для Android взят как раз с BSD( только ее сделали более легкой ), это к вопросу о переносе libc с BSD под Linux

lester ★★★★
()
Ответ на: комментарий от phasma

> упоротый шоле ?

от такого слышу, иди проспись

lester ★★★★
()

<dream>
Вот бы клонировать пару сотен раз Линуса и переписать все основные библиотеки и иксы с нуля....
</dream>

xorik ★★★★★
()
Ответ на: комментарий от iZEN

>Linux без GNU не может. Линус без GNU не хочет.

Не, не так.

бздун без венды не может

registrant ★★★★★
()
Ответ на: комментарий от xorik

надо им это сильно, они написали бы пару сотен ядер :)

lester ★★★★
()
Ответ на: комментарий от programmist

Торвальдс написал world и сказал ему hello!

lester ★★★★
()
Ответ на: комментарий от jeuta

> щас вот Столлман накурится и libastral напишет. ну и back-end к нему вебно-PHPшный...

"The PHP license is a BSD-style license" - врядли он будет писать на нем, он не кошерный

lester ★★★★
()
Ответ на: комментарий от lester

>> щас вот Столлман накурится и libastral напишет. ну и back-end к нему вебно-PHPшный...

>"The PHP license is a BSD-style license" - врядли он будет писать на нем, он не кошерный

нуу. есть сотни других путей. это я глупый, а не он =)

jeuta ★★★★
()
Ответ на: комментарий от lester

А GCC, к слову, давно умеет преобразовывать (x >> n) | (x << (32 - n)) в rol, а (x >> (32 - n)) | (x << n) в ror.



#include <stdint.h>

uint64_t rol64(uint64_t x, uint8_t n)
{
    return (x >> n) | (x << (64 - n));
}

uint64_t ror64(uint64_t x, uint8_t n)
{
    return (x >> (64 - n)) | (x << n);
}

uint32_t rol32(uint32_t x, uint8_t n)
{
    return (x >> n) | (x << (32 - n));
}

uint32_t ror32(uint32_t x, uint8_t n)
{
    return (x >> (32 - n)) | (x << n);
}

int main(void)
{
    return 0;
}


gcc -O3 -fomit-frame-pointer -masm=intel -S -c test.c -march=native


rol64:
        mov     ecx, esi
        ror     rdi, cl
        mov     rax, rdi
        ret

ror64:
        mov     ecx, esi
        rol     rdi, cl
        mov     rax, rdi
        ret

rol32:
        mov     ecx, esi
        ror     edi, cl
        mov     eax, edi
        ret

ror32:
        mov     ecx, esi
        rol     edi, cl
        mov     eax, edi
        ret

(в асме оставлен только релевантный код — я выбросил main и лишние метки).

Нужно ли было с ассемблером извращаться?

sjinks ★★★
()

Торвальдс в очередной раз показал, что умеет отлично тролить.

AndreyKl ★★★★★
()
Ответ на: комментарий от k0l0b0k

>а вообще кризис, да. на работу не берут, вот Линус решил "поддать газку" в виде пиара себя как крутого программера.

интересно, как связано то, что тебя не берут на работу (кризис тут врядли тому причина), с тем что Линус якобы решил попиарится? у тебя мания величия, кал0б0к

black7
()
Ответ на: комментарий от black7

>ну я так понимаю у гугля-то получилось сделать из г конфетку

сколько не делай из говна конфетку, получится только конфетка говна.

Pavval ★★★★★
()
Ответ на: комментарий от black7

не бздо, черный, с работой у меня все ок. а у тебя с юмором туговато видно.

k0l0b0k ★★
()
Ответ на: комментарий от lester

> "I get rid of two silly runtime loadable libraries that git no longer needs. And that in turn speeds up the test-suite by a couple of seconds." (с)

Какое отношение это имеет к реализации SHA1 на Ассемблере ? Мне вот git вообще не впился, как он был тормозным говном для человекоподобных робатав, так и останется.

phasma ★☆
()
Ответ на: комментарий от sjinks

>Нужно ли было с ассемблером извращаться?

Если внимательно смотреть на код линуса, то его макросы будут преобразованы в одну инструкцию, а не в 4. Что как бы намекает.

frame ★★★
()
Ответ на: комментарий от k0l0b0k

а вообще кризис, да. на работу не берут, вот Линус решил "поддать газку" в виде пиара себя как крутого программера.

Думаю что он стимулирует таким образом работу подобных контор которые находятся в несколько расслабленном состоянии. Он показал им что есть над чем работать :) Линус молодец !!!

crono
()

Линус самый ядреный троль из всех, кого я знаю.

OzOx
()
Ответ на: комментарий от phasma

>> "I get rid of two silly runtime loadable libraries that git no longer needs. And that in turn speeds up the test-suite by a couple of seconds." (с)

> Какое отношение это имеет к реализации SHA1 на Ассемблере ?

А ты и вправду упоротый )))) Торвальдс на C написал, а не на ассемблере

name_no ★★
()
Ответ на: комментарий от phasma

тут все умеют читать, кроме тебя, видимо

lester ★★★★
()

Вот почему, когда в личный блог что-то пишет Вася Пупкин, то это считают заурядным явлением, а когда в личный блог пишет известный человек, то все говорят, что он троллит, пиарится и т.п.?

Deleted
()
Ответ на: комментарий от phasma

Ещё раз, с самого начала: оригинальная либа написана на ассемблере. Торвальдс написал на С с небольшими ассемблерными вставками. Реализация Торвальдса получилась быстрее.

Но ассемблер так или иначе использовался и там, и там. В коде Линуса - эпизодически, в коде оригинальной либы - во весь рост.

А теперь говори шо ты хотел сказать :)

MYMUR ★★★★
()
Ответ на: комментарий от phasma

>Мне вот git вообще не впился, как он был тормозным говном для человекоподобных робатав, так и останется.

Фазмочка, я хз как ты при такой толщине умудряешься в поля ввода влазить.
Обозвать git тормозным - это сильно. А что же тогда быстрое?

Pavval ★★★★★
()
Ответ на: комментарий от Deleted

Так то ж Вася Пупкин, а это Линус Торвальдс, как бы другой статус. От человека ждут грандиозных свершений, важнейших открытий. А тут такая пошлость, SHA1... да ещё с намёком на красноглазие.

seiken ★★★★★
()
Ответ на: комментарий от lester

> ждем от Торвальдса свою реализацию libc

libc5?

> и компилятор

С него станется форкнуть, учитывая как он его ругает. А с GNU станется объявить форк основной веткой...

По теме: радует.

question4 ★★★★★
()
Ответ на: комментарий от ikm

> Ну и новости пошли. На моно написали hello, world, торвальдс написал sha1, что же будет дальше?

Поправка: особо быстрый sha1. Чувствуют, что процессорные ядра подходят к потолку производительности, и учатся писать оптимальный код. Хорошая тенденция, если так.

question4 ★★★★★
()
Ответ на: комментарий от heilnull

>>библиотек времени исполнения

> ПРОМТ

Правильный перевод можно?

question4 ★★★★★
()
Ответ на: комментарий от MYMUR

> А теперь говори шо ты хотел сказать :)

ну вообще изначально я хотел предложить использовать дополнительные регистры, которые появились со времен написания библиотеки, но потом подумал и ешил, что я ничего не хотел сказать.

phasma ★☆
()
Ответ на: комментарий от phasma

> ты понимаешь разницу в реализации на C и на Ассемблере ? Понимаешь, что это архитектурозависимо ?

Ты понимаешь, что огромным недостатком языка Си (за который бы голову оторвать его создателям) является отсутствие операторов циклического битового сдвига, которые присутствуют практически на всех процессорах и без которых не обходится ни подсчет CRC32, ни вычисление корректирующих кодов Рида-Соломона, ни куча других подобных алгоритмов?

Линус маладец.

xintrea
()
Ответ на: комментарий от shahid

> Не кормите)

Я помню,давно учили меня
Отец мой и мать: троллить-так троллить,
Любить-так любить, гулять-так гулять,
Стрелять-так стрелять.
Но тролли уже бегут далеко
Троллить-так троллить, ты мне помашу рукой.

phasma ★☆
()
Ответ на: комментарий от frame

> то его макросы будут преобразованы в одну инструкцию, а не в 4

Если внимательно посмотреть на код, который привел я, то можно увидеть, что функции а) не являются статическими, б) не имеют атрибута visibility(hidden). Как следствие, компилятор генерирует код функции целиком, так, что её можно вызывать из других единиц трансляции.

> Что как бы намекает.

Нужно не намекать, а немного думать.

#include <stdio.h>
#include <stdint.h>

#define SHA_ASM(op, x, n) ({ unsigned int __res; __asm__(op " %1,%0":"=r" (__res):"i" (n), "0" (x)); __res; })
#define SHA_ROL(x,n) SHA_ASM("rol", x, n)
#define SHA_ROR(x,n) SHA_ASM("ror", x, n)

uint32_t ror32(uint32_t x, uint8_t n)
{
    return (x << (32 - n)) | (x >> n);
}

int main(int arcg, char** argv)
{
    unsigned int res, x;

    scanf("%u", &x);
    res = SHA_ROR(x, 2);
    printf("%u\n", res);

    scanf("%u", &x);
    res = ror32(x, 2);
    printf("%u\n", res);

    return 0;
}

Результат (релевантная часть):

        call    __isoc99_scanf
        movl    $.LC1, %esi
        movl    $1, %edi
        xorl    %eax, %eax
        movl    12(%rsp), %edx
# 18 "test.c" 1
        ror $2,%edx
        call    __printf_chk

# ...

        call    __isoc99_scanf
        movl    12(%rsp), %edx
        movl    $.LC1, %esi
        movl    $1, %edi
        xorl    %eax, %eax
        rorl    $2, %edx
        call    __printf_chk

Те же самые три movl, один xorl и ror(l), не находите?

К слову о переносимости: вариант Линуса не будет работать, если второй аргумент функции не является константой.

sjinks ★★★
()
Ответ на: комментарий от question4

>> Мне вот git вообще не впился

> Альтернатива?

hg, bzr, monotone - тысячи их.

tailgunner ★★★★★
()
Ответ на: комментарий от phasma

>> Обозвать git тормозным - это сильно. А что же тогда быстрое?

>hg же, или ты осилил весь функционал git ?


Секундочку. Я про тормоза говорил. Не переводи стрелки.
И с каких это пор hg быстрее git? Пруф или GTFO.

Pavval ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.