LINUX.ORG.RU
ФорумTalks

acovea и оптимизация bzip2


0

0

Сегодня запустил тест acovea для обнаружения оптимальных CFLAGS для реализации алгоритма Хаффмана.

В итоге получил 20% прирост производительности bzip2 на сжатии каталога с сырцами linux kernel. То же самое проделал с gzip(никаких плюсов после перекомпиляции) и 7zip(после перекомпиляции стало ещё медленне).

CFLAGS="-O1 -march=athlon64 -msse3 -pipe -fno-merge-constants -fno-defer-pop -momit-leaf-frame-pointer -fno-if-conversion2 -fno-tree-ccp -fno-tree-dominator-opts -fno-tree-lrs -fno-tree-sra -fno-tree-copyrename -fno-tree-fre -fno-move-loop-invariants -fcse-skip-blocks -fgcse -fforce-mem -fpeephole2 -fschedule-insns2 -fregmove -fstrict-aliasing -freorder-blocks -fsched-interblock -fsched-spec -freorder-functions -funit-at-a-time -falign-loops -falign-labels -ftree-vrp -ftree-pre -finline-functions -funswitch-loops -fno-inline -fpeel-loops -funswitch-loops -funroll-all-loops -fbranch-target-load-optimize -fgcse-las -ftree-loop-linear -fbtr-bb-exclusive -mno-push-args -maccumulate-outgoing-args -D__NO_MATH_INLINES"

У самого amd64(turion ML-32).

Использовал gcc-4.1.2 и этот конфиг:
<?xml version="1.0"?>
<acovea_config>
    <acovea version="5.1" />
    <description value="gcc 4.1 athlon64 (AMD64/x86_64), no -ffast-math" version="1.0.0" />
    <get_version value="gcc -dumpversion" />
    <quoted_options value="false" />

    <prime command="gcc"
           flags="-lrt -lm -std=gnu99 -O1 -msse3 -march=athlon64 ACOVEA_OPTIONS -o ACOVEA_OUTPUT ACOVEA_INPUT" />

    <baseline description="-O1"
              command="gcc"
              flags="-lrt -lm -std=gnu99 -O1 -msse3 -march=athlon64 -o ACOVEA_OUTPUT ACOVEA_INPUT" />

    <baseline description="-O2"
              command="gcc"
              flags="-lrt -lm -std=gnu99 -O2 -msse3 -march=athlon64 -o ACOVEA_OUTPUT ACOVEA_INPUT" />

    <baseline description="-O3"
              command="gcc"
              flags="-lrt -lm -std=gnu99 -O3 -msse3 -march=athlon64 -o ACOVEA_OUTPUT ACOVEA_INPUT" />

    <baseline description="-O3 -ffast-math"
              command="gcc"
              flags="-lrt -lm -std=gnu99 -O3 -msse3 -march=athlon64 -ffast-math -o ACOVEA_OUTPUT ACOVEA_INPUT" />

    <baseline description="-Os"
              command="gcc"
              flags="-lrt -lm -std=gnu99 -Os -msse3 -march=athlon64 -o ACOVEA_OUTPUT ACOVEA_INPUT" />

    <!-- A list of flags that will be "evolved" by ACOVEA (85 for gcc 4.x!) -->
    <flags>

        <!-- O1 options (these turn off options implied by -O1) -->
        <flag type="simple" value="-fno-merge-constants" />
        <flag type="simple" value="-fno-defer-pop" />
        <flag type="simple" value="-fno-thread-jumps" />
        <flag type="enum"   value="-fno-omit-frame-pointer|-momit-leaf-frame-pointer" />
        <flag type="simple" value="-fno-guess-branch-probability" />
        <flag type="simple" value="-fno-cprop-registers" />
        <flag type="simple" value="-fno-if-conversion" />
        <flag type="simple" value="-fno-if-conversion2" />
        <flag type="simple" value="-fno-delayed-branch" />
        <flag type="enum"   value="-fno-loop-optimize|-floop-optimize2" />
        <flag type="simple" value="-fno-tree-ccp" />
        <flag type="simple" value="-fno-tree-dce" />
        <flag type="simple" value="-fno-tree-dominator-opts" />
        <flag type="simple" value="-fno-tree-dse" />
        <flag type="simple" value="-fno-tree-ter" />
        <flag type="simple" value="-fno-tree-lrs" />
        <flag type="simple" value="-fno-tree-sra" />
        <flag type="simple" value="-fno-tree-copyrename" />
        <flag type="simple" value="-fno-tree-fre" />
        <flag type="simple" value="-fno-tree-ch" />
        <flag type="simple" value="-fno-move-loop-invariants" />
        
        <!-- O2 options -->
        <flag type="simple" value="-fcrossjumping" />
        <flag type="simple" value="-foptimize-sibling-calls" />
        <flag type="simple" value="-fcse-follow-jumps" />
        <flag type="simple" value="-fcse-skip-blocks" />
        <flag type="simple" value="-fgcse" />
        <flag type="simple" value="-fexpensive-optimizations" />
        <flag type="simple" value="-fstrength-reduce" />
        <flag type="simple" value="-frerun-cse-after-loop" />
        <flag type="simple" value="-frerun-loop-opt" />
        <flag type="simple" value="-fcaller-saves" />
        <flag type="enum"   value="-fforce-mem|-fforce-addr" />
        <flag type="simple" value="-fpeephole2" />
        <flag type="simple" value="-fschedule-insns" />
        <flag type="simple" value="-fschedule-insns2" />
        <flag type="simple" value="-fregmove" />
        <flag type="simple" value="-fstrict-aliasing" />
        <flag type="simple" value="-fdelete-null-pointer-checks" />
        <flag type="simple" value="-freorder-blocks" />
        <flag type="simple" value="-fthread-jumps" />
        <flag type="simple" value="-fgcse-lm" />
        <flag type="simple" value="-fsched-interblock" />
        <flag type="simple" value="-fsched-spec" />
        <flag type="simple" value="-freorder-blocks" />
        <flag type="simple" value="-freorder-functions" />
        <flag type="simple" value="-funit-at-a-time" />
        <flag type="simple" value="-falign-functions" />
        <flag type="simple" value="-falign-jumps" />
        <flag type="simple" value="-falign-loops" />
        <flag type="simple" value="-falign-labels" />
        <flag type="simple" value="-ftree-vrp" />
        <flag type="simple" value="-ftree-pre" />

        <!-- O3 options -->
        <flag type="simple" value="-finline-functions" />
        <flag type="simple" value="-funswitch-loops" />
        <flag type="simple" value="-fgcse-after-reload" />
           
        <!-- Additional options -->
        <flag type="simple" value="-ffloat-store" />
        <flag type="simple" value="-fprefetch-loop-arrays" />
        <flag type="simple" value="-fno-inline" />
        <flag type="simple" value="-fpeel-loops" />
        <flag type="simple" value="-ftracer" />
        <flag type="simple" value="-funswitch-loops" />
        <flag type="enum"   value="-funroll-loops|-funroll-all-loops" />
        <flag type="enum"   value="-fbranch-target-load-optimize|-fbranch-target-load-optimize2" />
        <flag type="simple" value="-fmodulo-sched" />
        <flag type="simple" value="-fno-function-cse" />
        <flag type="simple" value="-fgcse-sm" />
        <flag type="simple" value="-fgcse-las" />
        <flag type="simple" value="-freschedule-modulo-scheduled-loops" />
        <flag type="simple" value="-ftree-loop-linear" />
        <flag type="simple" value="-ftree-loop-im" />
        <flag type="simple" value="-ftree-loop-ivcanon" />
        <flag type="simple" value="-fivopts" />
        <flag type="simple" value="-ftree-vectorize" />
        <flag type="simple" value="-fvariable-expansion-in-unroller" />
        <flag type="simple" value="-fbtr-bb-exclusive" />
	<flag type="simple" value="-fprofile-use" />

        <!-- Options specific to Intel-style architecture -->
        <flag type="simple" value="-mieee-fp" />
        <flag type="simple" value="-mno-push-args" />
        <flag type="simple" value="-maccumulate-outgoing-args" />
        <flag type="simple" value="-mno-align-stringops" />
        <flag type="simple" value="-minline-all-stringops" />
        <flag type="enum"   value="-mfpmath=387|-mfpmath=sse|-mfpmath=sse,387" />
        <flag type="simple" value="-D__NO_MATH_INLINES" />

        <!-- Tuning options that have a numeric value -->
        <flag type="tuning" value="-finline-limit" default="600" min="100" max="10000" step="200" separator="=" />

    </flags>

</acovea_config>

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

Результат такой:
Optimistic options:

                    -fno-tree-copyrename  (2.207)
                        -freorder-blocks  (1.605)
                  -fprefetch-loop-arrays  (1.538)
              -maccumulate-outgoing-args  (1.605)

Pessimistic options:

                 -fno-omit-frame-pointer  (-1.741)
           -fno-guess-branch-probability  (-2.478)
                      -fno-if-conversion  (-2.946)
                        -floop-optimize2  (-1.808)
                            -fno-tree-ch  (-2.277)
                          -funroll-loops  (-1.942)
                            -mfpmath=387  (-1.674)
                            -mfpmath=sse  (-2.009)
                        -mfpmath=sse,387  (-1.608)

A relative graph of fitnesses:

     Acovea's Best-of-the-Best: *****************************                         (1.91387)
       Acovea's Common Options: *************************************                 (2.41122)
                           -O1: *************************************                 (2.41335)
                           -O2: *********************************                     (2.18763)
                           -O3: *********************************                     (2.17066)
               -O3 -ffast-math: *********************************                     (2.17501)
                           -Os: **************************************************    (3.25302)

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

Я конечно не скажу, что аковея совсем уж сасёт, скорее даже рулит. Но! ХЗ - что эти флаги дают в плане глючности и нестабильности кода. Для примера использованы проверенные и подтверждённые опытом флаги:

darkstar shm # pwd /dev/shm

darkstar shm # ls -acl portage-20070321* -rw-r--r-- 1 root root 270796800 2007-03-25 00:53 portage-20070321a.tar -rw-r--r-- 1 1001 users 270796800 2007-03-25 00:53 portage-20070321b.tar

darkstar shm # cat bzip2-1.0.4a/Makefile | grep CFLAGS CFLAGS+=-Wall -Winline $(BIGFILES) -O3 -march=k8 -msse -pipe -finline-functions -finline-limit=6000000 -fprefetch-loop-arrays -funroll-all-loops -funswitch-loops $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2 $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover bzip2recover.o $(CC) $(CFLAGS) -c blocksort.c $(CC) $(CFLAGS) -c huffman.c $(CC) $(CFLAGS) -c crctable.c $(CC) $(CFLAGS) -c randtable.c $(CC) $(CFLAGS) -c compress.c $(CC) $(CFLAGS) -c decompress.c $(CC) $(CFLAGS) -c bzlib.c $(CC) $(CFLAGS) -c bzip2.c $(CC) $(CFLAGS) -c bzip2recover.c

darkstar shm # cat bzip2-1.0.4b/Makefile | grep CFLAGS CFLAGS+=-Wall -Winline $(BIGFILES) -finline-limit=6000000 -O1 -march=k8 -msse3 -pipe -fno-merge-constants -fno-defer-pop -momit-leaf-frame-pointer -fno-if-conversion2 -fno-tree-ccp -fno-tree-dominator-opts -fno-tree-lrs -fno-tree-sra -fno-tree-copyrename -fno-tree-fre -fno-move-loop-invariants -fcse-skip-blocks -fgcse -fforce-mem -fpeephole2 -fschedule-insns2 -fregmove -fstrict-aliasing -freorder-blocks -fsched-interblock -fsched-spec -freorder-functions -funit-at-a-time -falign-loops -falign-labels -ftree-vrp -ftree-pre -finline-functions -funswitch-loops -fno-inline -fpeel-loops -funswitch-loops -funroll-all-loops -fbranch-target-load-optimize -fgcse-las -ftree-loop-linear -fbtr-bb-exclusive -mno-push-args -maccumulate-outgoing-args -D__NO_MATH_INLINES $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2 $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover bzip2recover.o $(CC) $(CFLAGS) -c blocksort.c $(CC) $(CFLAGS) -c huffman.c $(CC) $(CFLAGS) -c crctable.c $(CC) $(CFLAGS) -c randtable.c $(CC) $(CFLAGS) -c compress.c $(CC) $(CFLAGS) -c decompress.c $(CC) $(CFLAGS) -c bzlib.c $(CC) $(CFLAGS) -c bzip2.c $(CC) $(CFLAGS) -c bzip2recover.c

darkstar shm # time ./bzip2-1.0.4a/bzip2 -9v portage-20070321a.tar portage-20070321a.tar: 7.364:1, 1.086 bits/byte, 86.42% saved, 270796800 in, 36773319 out.

real 0m55.382s user 0m54.670s sys 0m0.610s

darkstar shm # time ./bzip2-1.0.4b/bzip2 -9v portage-20070321b.tar portage-20070321b.tar: 7.364:1, 1.086 bits/byte, 86.42% saved, 270796800 in, 36773319 out.

real 0m51.185s user 0m50.970s sys 0m0.220s

darkstar shm # md5sum portage-20070321* f794e317aa1c49f3bd9a96b90546faad portage-20070321a.tar.bz2 f794e317aa1c49f3bd9a96b90546faad portage-20070321b.tar.bz2

Выигрыш есть реально, примерно 7%, но никак не 20. Осталось одно - вычислить то же самое для кернела ;)

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

Шит!

Я конечно не скажу, что аковея совсем уж сасёт, скорее даже рулит.
Но! ХЗ - что эти флаги дают в плане глючности и нестабильности кода.
Для примера использованы проверенные и подтверждённые опытом флаги: 

darkstar shm # pwd
/dev/shm

darkstar shm # ls -acl portage-20070321*
-rw-r--r-- 1 root root  270796800 2007-03-25 00:53 portage-20070321a.tar
-rw-r--r-- 1 1001 users 270796800 2007-03-25 00:53 portage-20070321b.tar

darkstar shm # cat bzip2-1.0.4a/Makefile | grep CFLAGS
CFLAGS+=-Wall -Winline $(BIGFILES) -O3 -march=k8 -msse -pipe
-finline-functions -finline-limit=6000000 -fprefetch-loop-arrays
-funroll-all-loops -funswitch-loops
        $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2
        $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover bzip2recover.o
        $(CC) $(CFLAGS) -c blocksort.c
        $(CC) $(CFLAGS) -c huffman.c
        $(CC) $(CFLAGS) -c crctable.c
        $(CC) $(CFLAGS) -c randtable.c
        $(CC) $(CFLAGS) -c compress.c
        $(CC) $(CFLAGS) -c decompress.c
        $(CC) $(CFLAGS) -c bzlib.c
        $(CC) $(CFLAGS) -c bzip2.c
        $(CC) $(CFLAGS) -c bzip2recover.c

darkstar shm # cat bzip2-1.0.4b/Makefile | grep CFLAGS
CFLAGS+=-Wall -Winline $(BIGFILES) -finline-limit=6000000 -O1
-march=k8 -msse3 -pipe -fno-merge-constants -fno-defer-pop
-momit-leaf-frame-pointer -fno-if-conversion2 -fno-tree-ccp
-fno-tree-dominator-opts -fno-tree-lrs -fno-tree-sra
-fno-tree-copyrename -fno-tree-fre -fno-move-loop-invariants
-fcse-skip-blocks -fgcse -fforce-mem -fpeephole2 -fschedule-insns2
-fregmove -fstrict-aliasing -freorder-blocks -fsched-interblock
-fsched-spec -freorder-functions -funit-at-a-time -falign-loops
-falign-labels -ftree-vrp -ftree-pre -finline-functions
-funswitch-loops -fno-inline -fpeel-loops -funswitch-loops
-funroll-all-loops -fbranch-target-load-optimize -fgcse-las
-ftree-loop-linear -fbtr-bb-exclusive -mno-push-args
-maccumulate-outgoing-args -D__NO_MATH_INLINES
        $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2
        $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover bzip2recover.o
        $(CC) $(CFLAGS) -c blocksort.c
        $(CC) $(CFLAGS) -c huffman.c
        $(CC) $(CFLAGS) -c crctable.c
        $(CC) $(CFLAGS) -c randtable.c
        $(CC) $(CFLAGS) -c compress.c
        $(CC) $(CFLAGS) -c decompress.c
        $(CC) $(CFLAGS) -c bzlib.c
        $(CC) $(CFLAGS) -c bzip2.c
        $(CC) $(CFLAGS) -c bzip2recover.c

darkstar shm # time ./bzip2-1.0.4a/bzip2 -9v portage-20070321a.tar
  portage-20070321a.tar:  7.364:1,  1.086 bits/byte, 86.42% saved, 270796800 in, 36773319 out.

real    0m55.382s
user    0m54.670s
sys     0m0.610s

darkstar shm # time ./bzip2-1.0.4b/bzip2 -9v portage-20070321b.tar
  portage-20070321b.tar:  7.364:1,  1.086 bits/byte, 86.42% saved, 270796800 in, 36773319 out.

real    0m51.185s
user    0m50.970s
sys     0m0.220s

darkstar shm # md5sum portage-20070321*
f794e317aa1c49f3bd9a96b90546faad  portage-20070321a.tar.bz2
f794e317aa1c49f3bd9a96b90546faad  portage-20070321b.tar.bz2

Выигрыш есть реально, примерно 7%, но никак не 20.
Осталось одно - вычислить то же самое для кернела ;)

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

>Выигрыш есть реально, примерно 7%, но никак не 20. Осталось одно - вычислить то же самое для кернела ;)

Попробуй.

Насчёт стабильности. Большинство этих флагов указываются в -O2 и -O3 автоматически. Доля сомнений довольно мала. Сомневаюсь только в новых флагах для gcc-4.1.x, которые не прошли, а с остальными вообще не собиралось.

Сейчас попробую проверить на portage.

Какой у тебя проц, сколько памяти? И какой gcc?

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

Вот такие пироги:

Сжимал (тоже в памяти): portage-20070321.tar
Команда: time bzip2 -k -9v portage-20070321.tar

Твои флаги:
user 1m7.964s
sys 0m0.612s

Мои флаги:
user 1m4.224s
sys 0m0.708s

-O3 -march=athlon64 -msse3:
user 1m19.869s
sys 0m0.812s

-O2 -march=athlon64 -msse3:
user 1m20.233s
sys 0m0.836s

-O1 -march=athlon64 -msse3:
user 1m13.401s
sys 0m0.668s

Сейчас попробую твои флаги на ruby.

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

>Сейчас попробую твои флаги на ruby.

На 10% хуже, чем -O2 -march=athlon64 -msse3

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