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 05:44 | Zajímavý software

    picogame (GitHub) je malý 2D herní engine pro mikrokontroléry jako RP2040, čip uvnitř kapesní konzole Picopad. Hru napíšeš v Pythonu a vyzkoušíš ji v prohlížeči nebo desktopovém simulátoru. Až bude hotová, zkopíruješ ji na podporovanou desku. Na začátku nepotřebuješ C, sestavení firmwaru ani hardware.

    Ladislav Hagara | Komentářů: 0
    včera 19:22 | Nová verze

    Multiplatformní prohlížeč elektronických knih KOReader byl vydán ve verzi 2026.07 "Sailing Walrus". U PDF souborů s SMask lze vyčistit pozadí. Přibyla podpora Kobo v5 nebo základní podpora OPDS 2.0.

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

    Společnost Valve sponzoruje a společnost Collabora portuje RADV (open source Vulkan ovladač pro AMD GPU z projektu Mesa) na Windows.

    Ladislav Hagara | Komentářů: 0
    28.7. 20:44 | Zajímavý projekt

    Starling (GitHub) je desktopové prostředí vytvořeno umělou inteligencí (s dohledem jednoho vývojáře během šesti měsíců).

    Ladislav Hagara | Komentářů: 26
    28.7. 14:22 | IT novinky

    Dne 30. června 2026 byla završena fyzická realizace projektu Czech National Quantum Communication Infrastructure (CZQCI), tedy České národní kvantové komunikační infrastruktury. Projekt byl realizován od 1. března 2023 a financován z Národního plánu obnovy částkou 121,6 milionu Kč. Cílem podpořeného projektu bylo vybudovat základy národní kvantové komunikační infrastruktury a ověřit možnosti jejího praktického využití. Mezi

    … více »
    Ladislav Hagara | Komentářů: 3
    28.7. 14:11 | IT novinky

    Město Šumperk se stalo terčem kybernetického útoku, chod úřadu je omezen. Zjišťuje se, jestli unikla nějaká data. Cílem hackerů byla městská datová síť. První útoky zaznamenali odborníci na informační technologie již v pondělí večer, závady se ale plně projevily až dnes ráno. Město událost nahlásilo Národnímu úřadu pro kybernetickou a informační bezpečnost (NUKIB).

    Ladislav Hagara | Komentářů: 1
    28.7. 13:55 | Bezpečnostní upozornění

    Samba, svobodná implementace síťového protokolu SMB/CIFS, byla vydána ve verzích 4.24.5, 4.23.10 a 4.22.11. Řešeno je 6 zranitelností.

    Ladislav Hagara | Komentářů: 0
    27.7. 23:44 | IT novinky

    Přední technologické společnosti (Adobe, Cadence, Capital One, Cisco, Cloudera, Cloudflare, Cognition, CrowdStrike, Databricks, Dell Technologies, DoorDash, Elastic, HPE, Hugging Face, IBM, LangChain, Linux Foundation, Microsoft, NAVER, NetApp, Nous Research, NVIDIA, OpenClaw, Palantir, Palo Alto Networks, Red Hat, Reflection AI, Salesforce, SAP, ServiceNow, Siemens, SK Telecom, Snowflake, SpacexAI, Synopsys, Thinking

    … více »
    Ladislav Hagara | Komentářů: 5
    27.7. 18:11 | Zajímavý projekt

    Krabix.cz je online 3D konfigurátor krabiček pro 3D tisk s exportem do STL. Běží přímo v prohlížeči. Nic se neposílá na server.

    Ladislav Hagara | Komentářů: 7
    27.7. 17:00 | Komunita

    Nadace Open Home Foundation spustila veřejnou preview verzi komunitní databáze zařízení pro Home Assistant. Má fungovat jako „Wikipedie pro chytrá zařízení".

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (11%)
     (7%)
     (2%)
     (18%)
     (30%)
     (5%)
     (6%)
     (2%)
     (15%)
     (23%)
    Celkem 2279 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník

    gcc nova optimalizace

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

    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
    zkus bugreport
    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: 19 | 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.