abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 07:33 | Komunita

    O víkendu probíhá konference OpenAlt 2025. Na programu je spousta zajímavých přednášek. Pokud jste v Brně, stavte se. Vstup zdarma.

    Ladislav Hagara | Komentářů: 0
    dnes 00:55 | IT novinky

    Josef Průša představil novou velkoformátovou uzavřenou CoreXY 3D tiskárnu Prusa CORE One L a nový open source standard chytrých cívek OpenPrintTag i s novou přepracovanou špulkou.

    Ladislav Hagara | Komentářů: 7
    včera 18:33 | IT novinky

    Na GOG.com běží Autumn Sale. Při té příležitosti je zdarma hororová počítačová hra STASIS (ProtonDB: Platinum).

    Ladislav Hagara | Komentářů: 0
    včera 13:22 | Komunita

    Ubuntu 25.10 má nově balíčky sestavené také pro úroveň mikroarchitektury x86-64-v3 (amd64v3).

    Ladislav Hagara | Komentářů: 8
    včera 01:22 | Nová verze

    Byla vydána verze 1.91.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.

    Ladislav Hagara | Komentářů: 0
    včera 00:11 | IT novinky

    Ministerstvo průmyslu a obchodu vyhlásilo druhou veřejnou soutěž v programu TWIST, který podporuje výzkum, vývoj a využití umělé inteligence v podnikání. Firmy mohou získat až 30 milionů korun na jeden projekt zaměřený na nové produkty či inovaci podnikových procesů. Návrhy projektů lze podávat od 31. října do 17. prosince 2025. Celková alokace výzvy činí 800 milionů korun.

    Ladislav Hagara | Komentářů: 5
    30.10. 23:44 | Komunita

    Google v srpnu oznámil, že na „certifikovaných“ zařízeních s Androidem omezí instalaci aplikací (včetně „sideloadingu“) tak, že bude vyžadovat, aby aplikace byly podepsány centrálně registrovanými vývojáři s ověřenou identitou. Iniciativa Keep Android Open se to snaží zvrátit. Podepsat lze otevřený dopis adresovaný Googlu nebo petici na Change.org.

    Ladislav Hagara | Komentářů: 0
    30.10. 15:22 | Nová verze

    Byla vydána nová verze 18 integrovaného vývojového prostředí (IDE) Qt Creator. S podporou Development Containers. Podrobný přehled novinek v changelogu.

    Ladislav Hagara | Komentářů: 2
    30.10. 12:55 | Nová verze

    Cursor (Wikipedie) od společnosti Anysphere byl vydán ve verzi 2.0. Jedná se o multiplatformní proprietární editor kódů s podporou AI (vibe coding).

    Ladislav Hagara | Komentářů: 1
    30.10. 02:55 | Nová verze

    Google Chrome 142 byl prohlášen za stabilní. Nejnovější stabilní verze 142.0.7444.59 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 20 bezpečnostních chyb. Za nejvážnější z nich bylo vyplaceno 50 000 dolarů. Vylepšeny byly také nástroje pro vývojáře.

    Ladislav Hagara | Komentářů: 0
    Jaké řešení používáte k vývoji / práci?
     (35%)
     (48%)
     (19%)
     (18%)
     (22%)
     (16%)
     (20%)
     (16%)
     (17%)
    Celkem 294 hlasů
     Komentářů: 14, poslední 14.10. 09:04
    Rozcestník

    gcc nova optimalizace

    29.9.2013 16:55 | Přečteno: 1309×

    testovaci program:
    #include <stdint.h>
    
    template<int N>
    struct Number {
    	enum { WORDS = N / 32 };
    	uint32_t words[WORDS] __attribute__((__aligned__(16)));
    	
    	void erase() __attribute__((noinline)) {
    		for (int i = 0; i < WORDS; ++i) { words[i] = 0; }
    	}
    };
    
    
    int main() {
    	Number<512> x;
    	for (int i = 0; i < 999999999; ++i) {
    		x.erase();
    	}
    }
    

    kod erase() vygenerovany gcc 4.7.3:
    _ZN6NumberILi512EE5eraseEv:
    .LFB2:
    	.cfi_startproc
    	pxor	%xmm0, %xmm0
    	movdqa	%xmm0, (%rdi)
    	movdqa	%xmm0, 16(%rdi)
    	movdqa	%xmm0, 32(%rdi)
    	movdqa	%xmm0, 48(%rdi)
    	ret
    
    doba behu:
    $ time ./a.out 
    
    real    0m2.435s
    user    0m2.416s
    sys     0m0.004s
    
    kod vygenerovany gcc 4.8.1:
    _ZN6NumberILi512EE5eraseEv:
    .LFB2:
    	.cfi_startproc
    	testb	$1, %dil
    	movl	$64, %edx
    	jne	.L27
    	testb	$2, %dil
    	jne	.L28
    .L3:
    	testb	$4, %dil
    	jne	.L29
    .L4:
    	movl	%edx, %ecx
    	xorl	%eax, %eax
    	shrl	$3, %ecx
    	testb	$4, %dl
    	rep stosq
    	je	.L5
    	movl	$0, (%rdi)
    	addq	$4, %rdi
    .L5:
    	testb	$2, %dl
    	je	.L6
    	xorl	%eax, %eax
    	addq	$2, %rdi
    	movw	%ax, -2(%rdi)
    .L6:
    	andl	$1, %edx
    	je	.L1
    	movb	$0, (%rdi)
    .L1:
    	rep ret
    	.p2align 4,,10
    	.p2align 3
    .L27:
    	movb	$0, (%rdi)
    	addq	$1, %rdi
    	movb	$63, %dl
    	testb	$2, %dil
    	je	.L3
    	.p2align 4,,10
    	.p2align 3
    .L28:
    	xorl	%ecx, %ecx
    	addq	$2, %rdi
    	subl	$2, %edx
    	movw	%cx, -2(%rdi)
    	testb	$4, %dil
    	je	.L4
    	.p2align 4,,10
    	.p2align 3
    .L29:
    	movl	$0, (%rdi)
    	subl	$4, %edx
    	addq	$4, %rdi
    	jmp	.L4
    	.cfi_endproc
    
    doba behu:
    $ time ./a.out 
    
    real    0m14.199s
    user    0m14.052s
    sys     0m0.040s
    
    z toho asm to vypada ze tam proste placl nejaky genericky kod pro nulovani pameti. Ted hledam, zatim bez uspechu, jak tuhle hruzu vypnout.        

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    29.9.2013 17:12 chrono
    Rozbalit Rozbalit vše Re: gcc nova optimalizace
    Nepomôže, keď bude vhodne zarovnaná aj tá premenná x?
    29.9.2013 17:24 ::: | skóre: 14 | blog: e_lama
    Rozbalit Rozbalit vše Re: gcc nova optimalizace
    nepomuze. Ta promenna uz je zarovnana kvuli tomu atributu. Navic prekladac pri kompilaci erase() nemuze vedet o vsech instancich a brat na ne ohled.
    29.9.2013 19:34 asdf
    Rozbalit Rozbalit vše Re: gcc nova optimalizace
    welcome to GNU land :-D
    29.9.2013 21:05 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: gcc nova optimalizace
    Clang tenhle problém nemá, produkuje to, co gcc 4.7 ;-)
    29.9.2013 21:41 ::: | skóre: 14 | blog: e_lama
    Rozbalit Rozbalit vše Re: gcc nova optimalizace
    O clangu nejakou dobu uvazuju, ale naposled kdyz jsem ho zkousel tak mel problemy s nekteryma vecma v c++11. A to i kdyz oficialne uz je mel podporovat.

    Mohl bych ho vyzkouset znovu jestli to uz opravili...
    David Heidelberg avatar 29.9.2013 22:28 David Heidelberg | skóre: 46 | blog: blog_
    Rozbalit Rozbalit vše Re: gcc nova optimalizace
    Jardík avatar 30.9.2013 00:20 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: gcc nova optimalizace
    g++ -o3 :-)
    0000000000400710 <_ZN6NumberILm512EE5eraseEv>:
      400710:       40 f6 c7 01             test   dil,0x1
      400714:       ba 40 00 00 00          mov    edx,0x40
      400719:       75 45                   jne    400760 <_ZN6NumberILm512EE5eraseEv+0x50>
      40071b:       40 f6 c7 02             test   dil,0x2
      40071f:       75 4f                   jne    400770 <_ZN6NumberILm512EE5eraseEv+0x60>
      400721:       40 f6 c7 04             test   dil,0x4
      400725:       75 61                   jne    400788 <_ZN6NumberILm512EE5eraseEv+0x78>
      400727:       89 d1                   mov    ecx,edx
      400729:       31 c0                   xor    eax,eax
      40072b:       c1 e9 03                shr    ecx,0x3
      40072e:       f6 c2 04                test   dl,0x4
      400731:       f3 48 ab                rep stos QWORD PTR es:[rdi],rax
      400734:       74 0a                   je     400740 <_ZN6NumberILm512EE5eraseEv+0x30>
      400736:       c7 07 00 00 00 00       mov    DWORD PTR [rdi],0x0
      40073c:       48 83 c7 04             add    rdi,0x4
      400740:       f6 c2 02                test   dl,0x2
      400743:       74 0a                   je     40074f <_ZN6NumberILm512EE5eraseEv+0x3f>
      400745:       31 c0                   xor    eax,eax
      400747:       48 83 c7 02             add    rdi,0x2
      40074b:       66 89 47 fe             mov    WORD PTR [rdi-0x2],ax
      40074f:       83 e2 01                and    edx,0x1
      400752:       74 03                   je     400757 <_ZN6NumberILm512EE5eraseEv+0x47>
      400754:       c6 07 00                mov    BYTE PTR [rdi],0x0
      400757:       f3 c3                   repz ret 
      400759:       0f 1f 80 00 00 00 00    nop    DWORD PTR [rax+0x0]
      400760:       c6 07 00                mov    BYTE PTR [rdi],0x0
      400763:       48 83 c7 01             add    rdi,0x1
      400767:       b2 3f                   mov    dl,0x3f
      400769:       40 f6 c7 02             test   dil,0x2
      40076d:       74 b2                   je     400721 <_ZN6NumberILm512EE5eraseEv+0x11>
      40076f:       90                      nop
      400770:       31 c9                   xor    ecx,ecx
      400772:       48 83 c7 02             add    rdi,0x2
      400776:       83 ea 02                sub    edx,0x2
      400779:       66 89 4f fe             mov    WORD PTR [rdi-0x2],cx
      40077d:       40 f6 c7 04             test   dil,0x4
      400781:       74 a4                   je     400727 <_ZN6NumberILm512EE5eraseEv+0x17>
      400783:       0f 1f 44 00 00          nop    DWORD PTR [rax+rax*1+0x0]
      400788:       c7 07 00 00 00 00       mov    DWORD PTR [rdi],0x0
      40078e:       83 ea 04                sub    edx,0x4
      400791:       48 83 c7 04             add    rdi,0x4
      400795:       eb 90                   jmp    400727 <_ZN6NumberILm512EE5eraseEv+0x17>
      400797:       66 0f 1f 84 00 00 00    nop    WORD PTR [rax+rax*1+0x0]
    
    g++ -O2 -ftree-vectorize:
    0000000000400710 <_ZN6NumberILm512EE5eraseEv>:
      400710:       66 0f ef c0             pxor   xmm0,xmm0
      400714:       48 8d 47 40             lea    rax,[rdi+0x40]
      400718:       66 0f 7f 07             movdqa XMMWORD PTR [rdi],xmm0
      40071c:       48 83 c7 10             add    rdi,0x10
      400720:       48 39 c7                cmp    rdi,rax
      400723:       75 f3                   jne    400718 <_ZN6NumberILm512EE5eraseEv+0x8>
      400725:       f3 c3                   repz ret
    
    g++ -O2 -ftree-vectorize -funroll-loops
    0000000000400750 <_ZN6NumberILm512EE5eraseEv>:
      400750:       66 0f ef c0             pxor   xmm0,xmm0
      400754:       66 0f 7f 07             movdqa XMMWORD PTR [rdi],xmm0
      400758:       66 0f 7f 47 10          movdqa XMMWORD PTR [rdi+0x10],xmm0
      40075d:       66 0f 7f 47 20          movdqa XMMWORD PTR [rdi+0x20],xmm0
      400762:       66 0f 7f 47 30          movdqa XMMWORD PTR [rdi+0x30],xmm0
      400767:       c3                      ret
    
    Můžeš zkusit -ftree-vectorizer-verbose=5 aby to kecalo.
    Věřím v jednoho Boha.
    Jardík avatar 30.9.2013 00:23 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: gcc nova optimalizace
    T toho plyne ... že to je z nějakého důvodu v gcc 4.8.1 vypnuté s -O2.
    Věřím v jednoho Boha.
    30.9.2013 12:23 Pavel Píša | skóre: 18 | blog: logic
    Rozbalit Rozbalit vše Re: gcc nova optimalizace
    Neuvádíte kompletní řádek s voláním GCC. Není možné, že při volbě určitého/cílového CPU (-mtune -march) bude výsledek při -O3 zoptimalizovaný podle představ. Je možné, že defaulní nastavení GCC je jiné kvůli buildu v distribuci nebo zjištění problémů na určité variantě architektury.

    Jardík avatar 30.9.2013 13:55 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: gcc nova optimalizace
    Volám
    g++ -std=c++11 -O2 -o bla bla.cpp
    ; stejný výsledek jako autor blogu
    
    g++ -std=c++11 -O3 -o bla bla.cpp
    ; z toho vyleze ta prasárna a je to hůře zoptimalizované
    ; než s -O2, nemám páru proč
    
    g++ -std=c++11 -O2 -ftree-vectorize -o bla bla.cpp
    ; sse2, ale ve smyčce
    
    g++ -std=c++11 -O2 -ftree-vectorize -funroll-loops -o bla bla.cpp
    ; dostanu sse2 kód bez smyčky
    
    Žádné extra -mtune či march nepřidávám, ale možná by stálo za to to zkusit. sse2 by to ale mělo použít bez nápovědy, to snad umí každý x86-64 cpu.
    Věřím v jednoho Boha.
    Jardík avatar 30.9.2013 13:56 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: gcc nova optimalizace
    Zkusil jsem ještě clang 3.3 a ten vyplyvne SSE2 bez smyčky s O2 bez dalších parametrů.
    Věřím v jednoho Boha.
    30.9.2013 12:12 ::: | skóre: 14 | blog: e_lama
    Rozbalit Rozbalit vše Re: gcc nova optimalizace
    Diky, dobrej postreh. Zkusim se podivat jakej je rozdil mezi -O2 a -O3 a postupne jednotlivy optimalizace vypinat.
    Jardík avatar 30.9.2013 14:00 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: gcc nova optimalizace
    Pozor. Optimalizovalo to s O2 s těma dalšíma optimalizacema, O3 mi produkuje totální prasárnu (a to i s -ftree-vectorize a -funroll-loops), O3 mi přijde rozbité.
    Věřím v jednoho Boha.
    30.9.2013 15:16 ::: | skóre: 14 | blog: e_lama
    Rozbalit Rozbalit vše Re: gcc nova optimalizace
    tak to asi dela tree-loop-distribute-patterns

    g++ -O2 -ftree-loop-distribute-patterns generuje stejny kod jako -O3.

    g++ -O3 -fno-tree-loop-distribute-patterns generuje:
    _ZN6NumberILi512EE5eraseEv:
    .LFB2:
    	.cfi_startproc
    	movl	4(%esp), %eax
    	movl	$0, (%eax)
    	movl	$0, 4(%eax)
    	movl	$0, 8(%eax)
    	movl	$0, 12(%eax)
    	movl	$0, 16(%eax)
    	movl	$0, 20(%eax)
    	movl	$0, 24(%eax)
    	movl	$0, 28(%eax)
    	movl	$0, 32(%eax)
    	movl	$0, 36(%eax)
    	movl	$0, 40(%eax)
    	movl	$0, 44(%eax)
    	movl	$0, 48(%eax)
    	movl	$0, 52(%eax)
    	movl	$0, 56(%eax)
    	movl	$0, 60(%eax)
    	ret
    
    coz uz je o neco lepsi.

    Asi zkusim zkompilovat nejnovejsi gcc a jestli to dela taky tak jim poslu bug report.

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.