LINUX.ORG.RU
решено ФорумTalks

2 megabaks: Векторизация ,как и было предсказано Зальцманном из бухгалтерии


0

2

прелюдия:
чтобы не считали тему 5.4,
речь идет о том включают ли флаги -msse* генерацию соответствующих инструкций в коде или имеют лишь пермиссивное значение


Итак маленькое пилотное исследование:

материал исследования - GNU bash 4.1,
скомпилированый бинарник содержит около 160 тысяч asm инструкций,
не содержит специализированных ассемблерных вставок с SSE/MMX.
инструментарий - GCC 4.3.4 release, GCC 4.4.3 release, GCC 4.5 release candidate,
а также вот эта утилита http://dev.gentoo.org/~dirtyepic/bin/analyze-x86 , которую я переписала в процессе на Си, потому что перлячья уж сильно тормозит

Значение исследования: помочь гентушникам и прочим собирателям из исходников познать дзен, ввиду того что публикуемая документация по GCC недостаточно данный вопрос раскрывает.

интерлюдия: о -march=native , разные версии GCC относятся к этому флагу немного по разному,
посмотреть что именно они имеют ввиду можно не только флажком -Q , но и флажком -v собирая любой файл,
итак hello_world.c

GCC 4.3
Core2 Penryn
-march=core2 -mcx16 -msahf --param l1-cache-size=32 --param l1-cache-line-size=64 -mtune=core2
Celeron M390
-march=pentium-m --param l1-cache-size=32 --param l1-cache-line-size=64 -mtune=generic
Atom 330 (не определены размеры кешей!)
-march=core2 -mcx16 -msahf -mtune=core2


GCC 4.4 (для атома - redhat svn версия, т.к. ванильная атом не поддерживает)
-march=core2 -mcx16 -msahf -msse4.1 --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=6144 -mtune=core2
-march=pentium-m --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=1024 -mtune=generic
-march=atom -mcx16 -msahf -mmovbe --param l1-cache-size=24 --param l1-cache-line-size=64 --param l2-cache-size=512 -mtune=atom


GCC4.5 (только для core2)
-march=core2 -mcx16 -msahf -msse4.1 --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=6144 -mtune=core2

выводы достаточно интересны тем, что -msse может как присутствовать, так и отсутствовать, практический вывод - нужно проверять что конкретно у вас.

Тесты для GCC4.4:

1) -O2 -march=core2
686: 394
mmx: 8

2) -O2 -march=core2 -msse4.1 -mmmx
686: 394
mmx: 8

3) -O2 -march=core2 -ftree-vectorize
686: 416
mmx: 17
sse: 1
sse2: 39

4) -O2 -march=core2 -ftree-vectorize -msse4.1 -mmmx
686: 416
mmx: 17
sse: 1
sse2: 39

5) -O2 -march=core2 -fno-tree-vectorize -mfpmath=sse
686: 394
mmx: 8

6) -O2 -march=core2 -fno-tree-vectorize -mfpmath=sse -msse4.1 -mmmx
686: 394
mmx: 8

для GCC 4.3 и GCC 4.5 rc результаты получились аналогичными, разве что у 4.5 число использования «высших» инструкций выросло, как для ppro, так и для mmx/sse

Выводы:

1) -mmmx включен всегда, несмотря на то что -Q показывает его как выключеный
2) -msse не включает генерацию соответствующих инструкций
3) -mfpmath задает только путь fpu/sse , в ассемблерном листинге не отлавливается (?) возможно следует повторить тест на чем-нибудь более интенсивно использующем математику
4) для -ftree-vectorize не имеет значение флаг -msse , достаточно -march=

Так что все подтверждается, -msse имеют лишь пермиссивное значение .
Если будете повторять - попробуйте взять что-нибудь другое, только без asm вставок с инструкциями mmx/sse

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

там есть asm
но обычно без mmx/sse

p7zip 9.04
make 7za

-O2 -march=pentium4

/tmp/p7zip_9.04 :$analyze-x86 bin/7za
instructions:
cpuid: 0 nop: 4593 call: 17422 count: 256860
i686: 668
mmx: 64

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

ps: float математики там нет,не годится

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

кстати на моём E7200 и мплеере имеет значение -msse4.1 и -mmmx

с ними

i486: 3684 i586:   16 ppro: 7047 mmx: 120560 sse: 5414 sse2: 4853 sse3:  755 sse4.1: 1003 sse4.2:    0
без них
i486: 3684 i586:   16 ppro: 7049 mmx: 121813 sse: 5414 sse2: 6373 sse3:  755 sse4.1:    0 sse4.2:    0
опять думаю...почему БЕЗ -mmmx собственно mmx БОЛЬШЕ?

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

во втором случае у вас меньше sse 4.1, так что возможно этот код был реализован в mmx и sse2 инструкциях

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

ппц

 -msse4.1 и -mmmx
с ними
i486: 3684 i586: 16 ppro: 7047 mmx: 120560 sse: 5414 sse2: 4853 sse3: 755 sse4.1: 1003 sse4.2: 0 
без них
i486: 3684 i586: 16 ppro: 7049 mmx: 121813 sse: 5414 sse2: 6373 sse3: 755 sse4.1: 0 sse4.2: 0
с -msse4.1, но без -mmmx
i486: 3684 i586: 16 ppro: 7047 mmx: 120560 sse: 5414 sse2: 4853 sse3: 755 sse4.1: 1003 sse4.2: 0

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

как видите -mmmx не нужен, вывод напрашивается сам собой )

по тому что «без», комментариев давать наверное не стану

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

-mmmx включается скорее -march

похоже - тест на гзипе

i486:    0 i586:    0 ppro:  109 mmx:   19 sse:    4 sse2:   44 sse3:    0 sse4.1:    0 sse4.2:    0
i486:    0 i586:    0 ppro:  109 mmx:   23 sse:    0 sse2:   44 sse3:    0 sse4.1:    0 sse4.2:    0
первое без - второе с

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

т.е. «с» - больше? ну тогда лучше указывать в CFLAGS чем пропустить

не зря же наверное -Q не показывает этот флаг как включеный

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

тот же гзип с march

i486: 0 i586: 0 ppro: 90 mmx: 8 sse: 0 sse2: 4 sse3: 0 sse4.1: 0 sse4.2: 0
-mfpmath=sse хм...

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

а если внимательно посмотреть, то часть mmx (4 штуки) заменились на sse

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

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

насколько gcc способен к генерации 3dnow(ext) самостоятельно - пусть проверяют владельцы amd )

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

таки gpl ) а что еще? оригинал на перл идет без лицензии
я оттуда ничего не взяла кроме массивов данных, которые в принципе доступны и через гугл элементарным поиском

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

правда там есть бага =) continue в проверках вида for (...) { if (strcmp() ) нужно continue добавить.

щас может нормально причешу тогда ещё одну версию положу.

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

там ok ставится чтобы без continue;
можно совсем убрать, я просто не совсем помню про то как оно работает, поэтому решила избежать, ну и в целом писала чтобы работало, так то я редко когда что пишу и уж совсем не пишу что-то много сложнее этого

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

ps: если найду время, то добавлю еще 64 bit sse* и специальные инструкции новых процессоров

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

я это понял, сейчас чутка поправил код ещё, может так удобнее будет добавлять доп тесты и т.п.:

http://dpaste.com/179248/

сравнил с выводом перлового, если 686=ppro, то всё ок.

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