Vektorizace. Paralelní architektury
|
|
- Jitka Říhová
- před 6 lety
- Počet zobrazení:
Transkript
1 Vektorizace Paralelní architektury Vektorové počítače
2 Paralelní architektury Definice: Paralelní architektura je taková, která obsahuje více jednotek pro zpracování dat (PU). RAM RAM RAM PU PU PU Timer I/O
3 Paralelní architektura II. Global RAM Interconnection Timer PU PU PU I/O Local RAM
4 Paralelní architektura II. Globální pamět - zprostředkovává komunikaci mezi výpočetními jednotkami Lokální pamět - výpočetní jednotky ji používají ve chvíli, kdy provádějí výpočty nezávisle na ostatních lokální pamět je přítomna ve všech paralelních architekturách přístup do globální paměti je vždy pomalý lokální pamět může být: operační pamět výpočetního uzlu v případu klastru nebo gridu cache pamět v případě více procesorových systémů registr v případě vektorových architektur (MMX, GPU)... Časovač (Timer) stejně jako u sekvenčních systémů i zda má význam synchronizace některé architektury (klastr,grid) jsou synchronizovány pouze přístupem do globální paměti, časovač zde pak chybí
5 Vektorové počítače - vector computers mají podporu i pro vektorovou aritmetiku např. umožňují v jednom kroku sečíst dva vektory patří sem jedny z prvních superpočítačů CDC STAR Cray-1 Cyber-205
6 Vektorové počítače Cray-1 byl instalován roku 1976 v Los Alamos National Laboratory
7 SIMD pro tyto architektury se vžilo označeni SIMD Single Instruction, Multiple Data dnes jsou zastoupeny v každém CPU jako SIMD instrukce
8 MMX MMX zkratka zřejmě znamená MultiMedia extension oficiálně ale žádný význam nemá, protože by jako zkratka nemohla být autorsky chráněna Intelem MMX bylo prvně implementováno v Pentiu P5, 1997 rozšíření využívá 8 64-bitových registrů pro výpočty s pohyblivou desetinnou čárkou, které lze využít pro MMX instrukce registry se označují jako MM0,..., MM7 nelze tedy zároveň provádět výpočty s pohyblivou čárkou a MMX instrukce po provedení jakékoliv instrukce je nutné vrátit registry do stavu použitelného pro desetinné výpočty instrukcí emms do těchto registrů lze načíst jeden 64-bitový quadword dva 32-bitové doublewordy čtyři 16-bitové wordy osm 8-bitových bajtů s nimi pak lze provádět paralelní operace
9 MMX Příklady některých MMX instrukcí padd psub s u s u b w d b w d b w d b w d sečti dva MMX registry jako 8 bajtů se znaménkem sečti dva MMX registry jako 4 wordy se znaménkem sečti dva MMX registry jako 2 doublewordy se znaménkem sečti dva MMX registry jako 8 bajtů bez znaménka sečti dva MMX registry jako 4 wordy bez znaménka sečti dva MMX registry jako 2 doublewordy bez znaménka odečti dva MMX registry jako 8 bajtů se znaménkem odečti dva MMX registry jako 4 wordy se znaménkem odečti dva MMX registry jako 2 doublewordy se znaménkem odečti dva MMX registry jako 8 bajtů bez znaménka odečti dva MMX registry jako 4 wordy bez znaménka odečti dva MMX registry jako 2 doublewordy bez znaménka
10 MMX MMX instrukce dále umožňují provádět bitové operace s obsahem registrů bitové posuvy porovnávání MMX nepodporuje dělení.
11 3DNow! v roce 1998 firma AMD rozšířila rozšíření MMX o instrukce pro operaci s typem float pi2fd, pf2id = konverze mezi float a int pfmax, pfmin = výpočet maxima a minima pfadd, pfsub, pfmul, pfrcp, pfrsqrt = přičítání, odčítání, násobení, převrácená hodnota, odmocnina dále jsou zde instrukce pro prefetching dat do cache v roce 1999 vzniklo další rozšíření 3DNow!2, které ale přidalo jen pár instrukcí
12 SSE SSE = Streaming SIMD Extension zavedla firma Intel v roce 1999 narozdíl od MMX a 3DNow! CPU dostává navíc osm 128-bitových registrů XMM0,... XMM7 každý registr může obsahovat čtyři čísla typu float
13 SSE lze provádět (mimo jiné) tyto operace se čtveřicemi čísel typu float addps = součet subps = rozdíl mulps = násobení divps = dělení rcpps = převrácená hodnota sqrtps = odmocnina rsqrtps = převrácená hodnota odmocniny maxps = maximum minps = minimum cmpxxps = porovnání, kde XX = eq, lt, le, ne, nlt, nle
14 SSE 2 jde o další rozšíření od firmy Intel z roku 2000 hlavní novinkou je podpora pro dvojitou přesnost double velikost registrů zůstala zachována, tudiž je do jednoho registru možné načíst jen dvě čísla typu double přibyly nové instrukce pro počítání s dvojitou přesností od instrukcí pro jednoduchou přesnost se liší pouze písmenem d místo s na konci tj. addpd místo addps apod.
15 SSE 3 a SSSE 3 SSE 3 je rozšíření z roku 2004 přidává jen pár dalších instrukcí zejména jde o tzv. horizontální instrukce, např. haddps = součet všech čtyř čísel v daném registru SSSE3 = Suplemental SSE3, 2006 přidává např. horizontální instrukce pro celočíselnou aritmetiku
16 SSE 4 SSE 4.1, 2007 přidává např. instrukci pro výpočet skalárního součinu nebo součtu absolutních hodnot rozdílu SSE 4.2 přidává instrukce pro práci s řetězci
17 AVX AVX = advanced vector extension, 2011 velikost registrů se zvyšuje ze 128-bitů na 256-bitů místo XMM0,..., XMM7 se jmenují YMM0,...,YMM7 v případě 64-bitových CPU přibudou i registry YMM8,...,YMM15 všechny instrukce z SSE se rozšiřují na tyto větší registry instrukce mohou mít i tři operandy SSE umí jen operace typu a += b AVX dokáže i a = b + c tyto instrukce podporují procesory architektury Sandy Bridge, Bulldozer a novější
18 AVX 2 AVX2, 2013 jde o další rozšíření AVX přibyla sada funkcí FMA3 = fused multiply-add jde o instrukce, které spočítají výraz a + b * c najednou přibyly funkce pro gather = načtení čísel, které nejsou v paměti uloženy v souvislém bloku tyto instrukce podporují procesory architektury Intel Haswell (2013), AMD Excavator (2015) a novější
19 AVX 512 AVX 512, 2015 jde o další zvětšení registrů až na 512-bitů umožní tedy operovat s až 8 operandy typu double prvně se objeví v akcelerátorech Knights Landing Xeon Phi (2015) a následně v procesorech Xeon řady Skylake (2016) a Cannonlake (2017)
20 Jsou celkem tři možnosti, jak využít tyto instrukce v našem kódu: využít optimalizace překladače využít "vnitřní" instrukce (intrinsic instructions) překladače (vložit kód v assembleru) nemá snad žádnou výhodu oproti druhé možnosti procesorem podporovaná rozšíření lze zjistit v Linuxu příkazem cat /proc/cpuinfo
21 překladače dokáží poměrně dobře využít vektorových instrukcí někdy je možné jim práci usnadnit hlavní překážky bránící překladači využít vektorových instrukcí jsou správné zarovnání dat v paměti možné překrývání polí nejasný počet opakování smyčky
22 Zarovnání dat v paměti memory alignment chceme-li použít SSE instrukce na pole čísel, musí toto pole začínat na adrese dělitelné bajtů = 128 bitů = velikost SSE registrů XMM obecně vždy platí, že data se do registru načítají mnohem rychleji, jsou-li v paměti zarovnána na násobek velikosti registru
23 Překryv polí array overlap, aliasing například následující smyčku není možné vektorizovat 1 f l o a t a [ 128 ] ; f l o a t b = &a [ 1 ] ; 4 for ( i n t i = 0; i < 127; i ++ ) 5 b [ i ] += a [ i ] ; Nejasný počet opakování smyčky opuštění smyčky může záviset na výpočtu v jejím vnitřku pokud např. meze for smyčky není násobek 4, musí se některé prvky zpracovat sekvenčně a to je nutné rozhodnout až za běhu programu
24 předáme-li překladači gcc přepínač -ftree-vectorizer-verbose=1, řekne nám, které smyčky vektorizoval nebo rozbalil místo jedničky lze udávat čísla až do šesti pro více informací
25 Příklad: Součet dvou vektorů 1 void v e c t o r A d d i t i o n ( const f l o a t v1, 2 const f l o a t v2, 3 const i n t size, 4 f l o a t sum ) 5 { 6 for ( i n t i = 0; i < size ; i ++ ) 7 sum [ i ] = v1 [ i ] + v2 [ i ] ; 8 } Překladač hlasí úspěšnou vektorizaci: 1 Analyzing loop at v e c t o r i z a t i o n / vector a d d i t i o n. cpp : V e c t o r i z i n g loop at v e c t o r i z a t i o n / vector a d d i t i o n. cpp :6 5 6 vector a d d i t i o n. cpp : 6 : note : create runtime check for data references _10 an 7 vector a d d i t i o n. cpp : 6 : note : create runtime check for data references _13 an 8 vector a d d i t i o n. cpp : 6 : note : created 2 v e r s i o n i n g for a l i a s checks vector a d d i t i o n. cpp : 6 : note : === vect_do_peeling_for_loop_bound === Setting up vector a d d i t i o n. cpp : 6 : note : LOOP VECTORIZED. 13 vector a d d i t i o n. cpp : 1 : note : v e c t o r i z e d 1 loops i n f u n c t i o n vector a d d i t i o n. cpp : 6 : note : Completely u n r o l l loop 2 times
26 Překladač nám hlásí: create runtime check for data references generuje kód pro kontrolu zarovnání polí za běhu programu created 2 versioning for alias checks generuje kód pro kontrolu překryvu polí LOOP VECTORIZED smyčka na řádku 6 byla vektorizována Následující příklady nám ukážou, co překladač vygeneroval. 1 gdb args vector a d d i t i o n 2 ( gbd ) disas v e c t o r A d d i t i o n
27 2 0x <+0>: t e s t %edx,%edx 3 0x <+2>: j l e 0x40147d < v e c t o r A d d i t i o n ( float const, float const, int, float )+381> 4 0x <+8>: lea 0x10(%rcx ),% rax 5 0x c <+12>: lea 0x10(% r d i ),% r9 6 0x <+16>: cmp %rax,% r d i 7 0x <+19>: setae %r8b 8 0x <+23>: cmp %r9,% rcx 9 0x a <+26>: setae %r9b 10 0x e <+30>: or %r9d,%r8d 11 0x <+33>: cmp %rax,% r s i 12 0x <+36>: lea 0x10(% r s i ),% r9 13 0x <+40>: setae %a l 14 0x b <+43>: cmp %r9,% rcx 15 0x e <+46>: setae %r9b 16 0x <+50>: or %r9d,%eax 17 0x <+53>: t e s t %al,%r8b 18 0x <+56>: j e 0x < v e c t o r A d d i t i o n ( float const, float const, int, float )+384> 19 0x e <+62>: cmp $0xb,%edx 20 0x <+65>: jbe 0x < v e c t o r A d d i t i o n ( float const, float const, int, float )+384> 21 0x <+71>: push %r x <+73>: mov %edx,%r10d 23 0x c <+76>: shr $0x2,%r10d 24 0x <+80>: push %rbp 25 0x <+81>: cmp $0x4,%r10d 26 0x <+85>: push %rbx 27 0x <+86>: lea 0x0(,% r10,4),% ebx 28 0x e <+94>: jbe 0x < v e c t o r A d d i t i o n ( float const, float const, int, float )+800> 29 0x <+100>: lea 0x5(%r10 ),%eax 30 0x <+104>: lea 0x40(% r d i ),% r8 31 0x c <+108>: mov %rsi,%r9 32 0x f <+111>: shr $0x2,%eax 33 0x <+114>: xor %r11d,%r11d 34 0x <+117>: s h l $0x6,%rax 35 0x <+121>: lea 0x80(% r d i,%rax,1),% r x <+129>: mov %rcx,%rax 37 0x <+132>: movups (%r9 ),%xmm1 38 0x <+136>: movups 0x40(%r8 ),%xmm0 39 0x d <+141>: p r e f e t c h t 0 0x100(%r8 ) 40 0x <+149>: p r e f e t c h t 0 0x140(%r9 ) 41 0x d <+157>: mov %r8,%rbp 42 0x a0 <+160>: add $0x40,%r8 43 0x a4 <+164>: minps %xmm1,%xmm0 44 0x a7 <+167>: prefetchw 0x140(%rax ) 45 0x ae <+174>: add $0x40,%r9 46 0x b2 <+178>: add $0x40,%rax 47 0x b6 <+182>: add $0x4,%r11d 48 0x ba <+186>: movlps %xmm0, 0x40(%rax ) 49 0x be <+190>: movhps %xmm0, 0x38(%rax ) 50 0x c2 <+194>: movups 0x30(%r9 ),%xmm1 51 0x c7 <+199>: movups 0x70(%r8 ),%xmm0 52 0x cc <+204>: minps %xmm1,%xmm0 53 0x cf <+207>: movlps %xmm0, 0x30(%rax ) 54 0x d3 <+211>: movhps %xmm0, 0x28(%rax ) 55 0x d7 <+215>: movups 0x20(%r9 ),%xmm1 56 0x dc <+220>: movups 0x60(%r8 ),%xmm0 57 0x e1 <+225>: minps %xmm1,%xmm0 58 0x e4 <+228>: movlps %xmm0, 0x20(%rax ) 59 0x e8 <+232>: movhps %xmm0, 0x18(%rax ) 60 0x ec <+236>: movups 0x50(%r8 ),%xmm0 61 0x f1 <+241>: movups 0x10(%r9 ),%xmm1 62 0x f6 <+246>: minps %xmm1,%xmm0 63 0x f9 <+249>: movlps %xmm0, 0x10(%rax ) 64 0x fd <+253>: movhps %xmm0, 0x8(%rax ) 65 0x <+257>: cmp %r12,%r8 66 0x <+260>: jne 0x < v e c t o r A d d i t i o n ( float const, float const, int, float )+132> 67 0x a <+266>: xor %r8d,%r8d 68 0x d <+269>: movups 0x0(%rbp,%r8,1),%xmm0 69 0x <+275>: movups (%r9,%r8,1),%xmm1 70 0x <+280>: i n c %r11d 71 0x b <+283>: minps %xmm1,%xmm0 72 0x e <+286>: movlps %xmm0,(% rax,%r8, 1 ) 73 0x <+291>: movhps %xmm0,0 x8(%rax,%r8, 1 ) 74 0x <+297>: add $0x10,%r8 75 0x d <+301>: cmp %r11d,%r10d 76 0x <+304>: j a 0x40140d < v e c t o r A d d i t i o n ( float const, float const, int, float )+269> 77 0x <+306>: cmp %ebx,%edx 78 0x <+308>: j e 0x < v e c t o r A d d i t i o n ( float const, float const, int, float )+377> 79 0x <+310>: movslq %ebx,%rax 80 0x <+313>: movss (% r d i,%rax,4),%xmm0 81 0x e <+318>: minss (% r s i,%rax,4),%xmm0 82 0x <+323>: movss %xmm0,(% rcx,%rax, 4 ) 83 0x <+328>: lea 0x1(%rbx ),%eax 84 0x b <+331>: cmp %edx,%eax 85 0x d <+333>: jge 0x < v e c t o r A d d i t i o n ( float const, float const, int, float )+377> 86 0x f <+335>: c l t q 87 0x <+337>: add $0x2,%ebx 88 0x <+340>: movss (% r d i,%rax,4),%xmm0 89 0x <+345>: cmp %ebx,%edx 90 0x b <+347>: minss (% r s i,%rax,4),%xmm0 91 0x <+352>: movss %xmm0,(% rcx,%rax, 4 ) 92 0x <+357>: j l e 0x < v e c t o r A d d i t i o n ( float const, float const, int, float )+377> 93 0x <+359>: movslq %ebx,%rbx 94 0x a <+362>: movss (% r d i,%rbx,4),%xmm0 95 0x f <+367>: minss (% r s i,%rbx,4),%xmm0 96 0x <+372>: movss %xmm0,(% rcx,%rbx, 4 ) 97 0x <+377>: pop %rbx 98 0x a <+378>: pop %rbp 99 0x b <+379>: pop %r x d <+381>: repz r e t q 101 0x f <+383>: nop 102 0x <+384>: cmp $0x10,%edx 103 0x <+387>: j l e 0x < v e c t o r A d d i t i o n ( float const, float const, int, float )+817> 104 0x <+393>: lea 0x11(%rdx ),% r10d 105 0x d <+397>: mov %rdi,%r x <+400>: mov %rsi,%r x <+403>: and $0xfffffff0,%r10d 108 0x <+407>: mov %rcx,%rax 109 0x a <+410>: lea 0x10(%r10 ),% r11d 110 0x e <+414>: xor %r10d,%r10d 111 0x a1 <+417>: nopl 0x0(%rax ) 112 0x a8 <+424>: movss (%r9 ),%xmm x ad <+429>: p r e f e t c h t 0 0x4c(%r9 ) 114 0x b2 <+434>: p r e f e t c h t 0 0x4c(%r8 ) 115 0x b7 <+439>: prefetchw 0x4c(%rax ) 116 0x bb <+443>: add $0x10,%r10d 117 0x bf <+447>: add $0x40,%r x c3 <+451>: minss (%r8 ),%xmm x c8 <+456>: add $0x40,%rax 120 0x cc <+460>: add $0x40,%r x d0 <+464>: movss %xmm0, 0x40(%rax ) 122 0x d5 <+469>: movss 0x3c(%r9 ),%xmm x db <+475>: minss 0x3c(%r8 ),%xmm x e1 <+481>: movss %xmm0, 0x3c(%rax ) 125 0x e6 <+486>: movss 0x38(%r9 ),%xmm x ec <+492>: minss 0x38(%r8 ),%xmm x f2 <+498>: movss %xmm0, 0x38(%rax ) 128 0x f7 <+503>: movss 0x34(%r9 ),%xmm x fd <+509>: minss 0x34(%r8 ),%xmm x <+515>: movss %xmm0, 0x34(%rax ) 131 0x <+520>: movss 0x30(%r9 ),%xmm x e <+526>: minss 0x30(%r8 ),%xmm x <+532>: movss %xmm0, 0x30(%rax ) 134 0x <+537>: movss 0x2c(%r9 ),%xmm x f <+543>: minss 0x2c(%r8 ),%xmm x <+549>: movss %xmm0, 0x2c(%rax ) 137 0x a <+554>: movss 0x28(%r9 ),%xmm x <+560>: minss 0x28(%r8 ),%xmm0 139 $ Optimalizace pomocí vektorových instrukcí 1 Dump of assembler code for f u n c t i o n v e c t o r A d d i t i o n ( float const, float const, int, float ) :
28 funkce má velikost 560 bajtů ukážeme si, jak překladači práci usnadnit nejprve je potřeba mít všechna pole v paměti správně zarovnána toho lze dosáhnout pomocí funkce memalign 1 #include <malloc. h> 2 3 float aligned_v1 = ( float ) memalign ( 16, size sizeof ( float ) ) ; 4 float aligned_v2 = ( float ) memalign ( 16, size sizeof ( float ) ) ; 5 float aligned_sum = ( float ) memalign ( 16, size sizeof ( float ) ) ; první parameter, který je tu navíc, udává, na kolik bajtů se má zarovnání provést zarovnání musí být mocnina dvou dále to musíme překladači oznámit ve funkci samotné 1 void alignedvectoraddition ( const float v1, 2 const float v2, 3 const i n t size, 4 float sum ) 5 { 6 float _sum = ( float ) builtin_assume_aligned ( sum, 16); 7 const float _v1 = ( const float ) builtin_assume_aligned ( v1, 16); 8 const float _v2 = ( const float ) builtin_assume_aligned ( &v2 [ i ], 16); 9 for ( i n t i = 0; i < size ; i ++ ) 10 { 11 _sum [ i ] = _v1 [ i ] + _v2 [ i ] ; 12 } 13 }
29 1 Dump of assembler code for f u n c t i o n alignedvectoraddition ( float const, float const, int, float ) : 2 0x <+0>: t e s t %edx,%edx 3 0x <+2>: j l e 0x40115f < alignedvectoraddition ( float const, float const, int, float )+223> 4 0x <+8>: lea 0x10(% r d i ),% r8 5 0x c <+12>: lea 0x10(%rcx ),% rax 6 0x <+16>: cmp %r8,% rcx 7 0x <+19>: setae %r8b 8 0x <+23>: cmp %rax,% r d i 9 0x a <+26>: setae %r9b 10 0x e <+30>: or %r9d,%r8d 11 0x a1 <+33>: lea 0x10(% r s i ),% r9 12 0x a5 <+37>: cmp %rax,% r s i 13 0x a8 <+40>: setae %a l 14 0x ab <+43>: cmp %r9,% rcx 15 0x ae <+46>: setae %r9b 16 0x b2 <+50>: or %r9d,%eax 17 0x b5 <+53>: t e s t %al,%r8b 18 0x b8 <+56>: j e 0x < alignedvectoraddition ( float const, float const, int, float )+192> 19 0x be <+62>: cmp $0x5,%edx 20 0x c1 <+65>: jbe 0x < alignedvectoraddition ( float const, float const, int, float )+192> 21 0x c3 <+67>: mov %edx,%r10d 22 0x c6 <+70>: xor %eax,%eax 23 0x c8 <+72>: xor %r8d,%r8d 24 0x cb <+75>: shr $0x2,%r10d 25 0x cf <+79>: lea 0x0(,% r10,4),% r9d 26 0x d7 <+87>: movaps (% r d i,%rax,1),%xmm0 27 0x db <+91>: add $0x1,%r8d 28 0x df <+95>: addps (% r s i,%rax,1),%xmm0 29 0x e3 <+99>: movaps %xmm0,(% rcx,%rax, 1 ) 30 0x e7 <+103>: add $0x10,%rax 31 0x eb <+107>: cmp %r10d,%r8d 32 0x ee <+110>: j b 0x4010d7 < alignedvectoraddition ( float const, float const, int, float )+87> 33 0x f0 <+112>: cmp %r9d,%edx 34 0x f3 <+115>: j e 0x40115f < alignedvectoraddition ( float const, float const, int, float )+223> 35 0x f5 <+117>: movslq %r9d,%rax 36 0x f8 <+120>: movss (% r d i,%rax,4),%xmm0 37 0x fd <+125>: addss (% r s i,%rax,4),%xmm0 38 0x <+130>: movss %xmm0,(% rcx,%rax, 4 ) 39 0x <+135>: lea 0x1(%r9 ),%eax 40 0x b <+139>: cmp %eax,%edx 41 0x d <+141>: j l e 0x40115f < alignedvectoraddition ( float const, float const, int, float )+223> 42 0x f <+143>: c l t q 43 0x <+145>: add $0x2,%r9d 44 0x <+149>: movss (% r d i,%rax,4),%xmm0 45 0x a <+154>: cmp %r9d,%edx 46 0x d <+157>: addss (% r s i,%rax,4),%xmm0 47 0x <+162>: movss %xmm0,(% rcx,%rax, 4 ) 48 0x <+167>: j l e 0x < alignedvectoraddition ( float const, float const, int, float )+232> 49 0x <+169>: movslq %r9d,%r9 50 0x c <+172>: movss (% rdi,%r9,4),%xmm0 51 0x <+178>: addss (% rsi,%r9,4),%xmm0 52 0x <+184>: movss %xmm0,(% rcx,%r9, 4 ) 53 0x e <+190>: r e t q 54 0x f <+191>: nop 55 0x <+192>: xor %eax,%eax 56 0x <+194>: nopw 0x0(%rax,%rax, 1 ) 57 0x <+200>: movss (% r d i,%rax,4),%xmm0 58 0x d <+205>: addss (% r s i,%rax,4),%xmm0 59 0x <+210>: movss %xmm0,(% rcx,%rax, 4 ) 60 0x <+215>: add $0x1,%rax 61 0x b <+219>: cmp %eax,%edx 62 0x d <+221>: j g 0x < alignedvectoraddition ( float const, float const, int, float )+200> 63 0x f <+223>: repz r e t q 64 0x <+225>: nopl 0x0(%rax ) 65 0x <+232>: repz r e t q
30 kód se zmenšil na 232 bajtů dále překladači řekneme, že pole se nepřekrývají pomocí atributu restrict 1 void a l i g n e d V e c t o r A d d i t i o n ( const f l o a t r e s t r i c t v1, 2 const f l o a t r e s t r i c t v2, 3 const i n t size, 4 f l o a t r e s t r i c t sum ) 5 { 6 f l o a t _sum = ( f l o a t ) builtin_assume_aligned ( sum, 1 6 ) ; 7 const f l o a t _v1 = ( const f l o a t ) builtin_assume_aligned ( v1, 1 6 ) ; 8 const f l o a t _v2 = ( const f l o a t ) builtin_assume_aligned ( &v2 [ i ], 1 6 ) 9 for ( i n t i = 0; i < size ; i ++ ) 10 { 11 _sum [ i ] = _v1 [ i ] + _v2 [ i ] ; 12 } 13 }
31 1 Dump of assembler code for f u n c t i o n alignedvectoraddition ( float const, float const, int, float ) : 2 0x <+0>: t e s t %edx,%edx 3 0x <+2>: j l e 0x < alignedvectoraddition ( float const, float const, int, float )+160> 4 0x <+8>: mov %edx,%r9d 5 0x b <+11>: shr $0x2,%r9d 6 0x f <+15>: lea 0x0(,% r9,4),% eax 7 0x <+23>: t e s t %eax,%eax 8 0x <+25>: j e 0x < alignedvectoraddition ( float const, float const, int, float )+168> 9 0x f <+31>: cmp $0x3,%edx 10 0x a2 <+34>: jbe 0x < alignedvectoraddition ( float const, float const, int, float )+168> 11 0x a8 <+40>: xor %r8d,%r8d 12 0x ab <+43>: xor %r10d,%r10d 13 0x ae <+46>: movaps (% r d i,%r8,1),%xmm0 14 0x b3 <+51>: add $0x1,%r10d 15 0x b7 <+55>: addps (% r s i,%r8,1),%xmm0 16 0x bc <+60>: movaps %xmm0,(% rcx,%r8, 1 ) 17 0x c1 <+65>: add $0x10,%r8 18 0x c5 <+69>: cmp %r10d,%r9d 19 0x c8 <+72>: j a 0x4010ae < alignedvectoraddition ( float const, float const, int, float )+46> 20 0x ca <+74>: cmp %edx,%eax 21 0x cc <+76>: j e 0x < alignedvectoraddition ( float const, float const, int, float )+176> 22 0x ce <+78>: movslq %eax,%r8 23 0x d1 <+81>: movss (% r d i,%r8,4),%xmm0 24 0x d7 <+87>: addss (% r s i,%r8,4),%xmm0 25 0x dd <+93>: movss %xmm0,(% rcx,%r8, 4 ) 26 0x e3 <+99>: lea 0x1(%rax ),% r8d 27 0x e7 <+103>: cmp %r8d,%edx 28 0x ea <+106>: j l e 0x < alignedvectoraddition ( float const, float const, int, float )+160> 29 0x ec <+108>: movslq %r8d,%r8 30 0x ef <+111>: add $0x2,%eax 31 0x f2 <+114>: movss (% r d i,%r8,4),%xmm0 32 0x f8 <+120>: cmp %eax,%edx 33 0x fa <+122>: addss (% r s i,%r8,4),%xmm0 34 0x <+128>: movss %xmm0,(% rcx,%r8, 4 ) 35 0x <+134>: j l e 0x < alignedvectoraddition ( float const, float const, int, float )+160> 36 0x <+136>: c l t q 37 0x a <+138>: movss (% r d i,%rax,4),%xmm0 38 0x f <+143>: addss (% r s i,%rax,4),%xmm0 39 0x <+148>: movss %xmm0,(% rcx,%rax, 4 ) 40 0x <+153>: r e t q 41 0x a <+154>: nopw 0x0(%rax,%rax, 1 ) 42 0x <+160>: repz r e t q 43 0x <+162>: nopw 0x0(%rax,%rax, 1 ) 44 0x <+168>: xor %eax,%eax 45 0x a <+170>: jmp 0x4010ce < alignedvectoraddition ( float const, float const, int, float )+78> 46 0x c <+172>: nopl 0x0(%rax ) 47 0x <+176>: repz r e t q 48 $
32 dostali jsme se na 176 bajtů dalšího zjednodušení lze dosáhnout, pokud můžeme předpokládat fixní počet opakování dělitelný čtyřmi 1 const i n t size = 16; 2 void a l i g n e d V e c t o r A d d i t i o n ( const f l o a t r e s t r i c t v1, 3 const f l o a t r e s t r i c t v2, 4 f l o a t r e s t r i c t sum ) 5 { 6 f l o a t _sum = ( f l o a t ) builtin_assume_aligned ( sum, 1 6 ) ; 7 const f l o a t _v1 = ( const f l o a t ) builtin_assume_aligned ( v1, 1 6 ) ; 8 const f l o a t _v2 = ( const f l o a t ) builtin_assume_aligned ( &v2 [ i ], 1 6 ) 9 for ( i n t i = 0; i < size ; i ++ ) 10 { 11 _sum [ i ] = _v1 [ i ] + _v2 [ i ] ; 12 } 13 }
33 1 Dump of assembler code for f u n c t i o n alignedvectoraddition ( float const, float const, float ) : 2 0x a0 <+0>: xor %eax,%eax 3 0x a2 <+2>: nopw 0x0(%rax,%rax, 1 ) 4 0x a8 <+8>: movaps (%r d i,%rax,1),%xmm0 5 0x ac <+12>: addps (%r s i,%rax,1),%xmm0 6 0x b0 <+16>: movaps %xmm0,(% rdx,%rax, 1 ) 7 0x b4 <+20>: add $0x10,%rax 8 0x b8 <+24>: cmp $0x40000,%rax 9 0x be <+30>: jne 0x4010a8 < alignedvectoraddition ( float const, float const, float )+8> 10 0x c0 <+32>: repz r e t q dostáváme 32 bajtů kódu, tj. osmkrát méně, než na počátku jak se to projeví na efektivitě kódu?
34 překvapivě se to neprojeví nijak v každé verzi trvá zpracování jednoho elementu cca. 4 takty vidíme tedy, že překladač dokáže jednoduché smyčky vektorizovat velmi efektivně výsledný kód je efektivní i pro pole, která nejsou v paměti správně zarovnána naše optimalizace ale eliminovaly více než půl kilobajtu kódu to by mohlo být užitečné v situaci, kdy chceme optimalizovat využtití instrukční L1 cache ta má velikost cca. 16kB podívejme se ještě, co vše lze vektorizovat
35 Vektorizace podmínek: 1 void alignedvectormin ( const f l o a t r e s t r i c t v1, 2 f l o a t r e s t r i c t sum ) 3 { 4 f l o a t _sum = ( f l o a t ) builtin_assume_aligned ( sum, 1 6 ) ; 5 const f l o a t _v1 = ( const f l o a t ) builtin_assume_aligned ( v1, 1 6 ) ; 6 for ( i n t i = 0; i < size ; i ++ ) 7 { 8 i f ( _sum [ i ] < _v1 [ i ] ) 9 _sum [ i ] = _v1 [ i ] ; 10 } 11 } v tomto případě nám překladač žádnou vektorizaci nehlasí a ve výsledném kódu také žádná vektorová instrukce použita není 1 Dump of assembler code for f u n c t i o n alignedvectoraddition ( float const, float const, float ) : 2 0x <+0>: xor %eax,%eax 3 0x <+2>: nopw 0x0(%rax,%rax, 1 ) 4 0x <+8>: movss (%r d i,%rax,1),%xmm0 5 0x d <+13>: ucomiss (%rdx,%rax,1),%xmm0 6 0x <+17>: jbe 0x < alignedvectoraddition ( float const, float const, float )+24> 7 0x <+19>: movss %xmm0,(% rdx,%rax, 1 ) 8 0x <+24>: add $0x4,%rax 9 0x c <+28>: cmp $0x40000,%rax 10 0x a2 <+34>: jne 0x < alignedvectoraddition ( float const, float const, float )+8> 11 0x a4 <+36>: repz r e t q důvodem je, že pokud není splněna podmínka if( _sum[ i ] < _v1[ i ] ), překladač nemá nic dělat vektorové instrukce neumí deaktivovat část XMM registru bylo by sice možné generovat kód _sum[ i ] = _sum[ i ], ale to překladač nemůže obecně by to nebylo bezpečné v případu běhu více vláken
36 úprava kódu na tvar 1 for ( i = 0; i < size ; i ++ ) 2 { 3 i f ( _sum [ i ] < _v1 [ i ] ) 4 _sum [ i ] = _v1 [ i ] ; 5 else 6 _sum [ i ] = _sum [ i ] ; 7 } ale nepomůže překladač zřejmě vidí příkaz _sum[ i ] = _sum[ i ] jako zbytečný a eliminuje ho ještě před analýzou možné vektorizace použijeme operátor?
37 1 void alignedvectormin ( const f l o a t r e s t r i c t v1, 2 f l o a t r e s t r i c t sum ) 3 { 4 f l o a t _sum = ( f l o a t ) builtin_assume_aligned ( sum, 1 6 ) ; 5 const f l o a t _v1 = ( const f l o a t ) builtin_assume_aligned ( v1, 1 6 ) ; 6 for ( i n t i = 0; i < s ize ; i ++ ) 7 _sum [ i ] = _sum [ i ] < _v1 [ i ]? _v1 [ i ] : _sum [ i ] ; 8 } výsledkem je již kód, který obsahuje instrukci maxps 1 Dump of assembler code for f u n c t i o n alignedvectoraddition ( float const, float const, float ) : 2 0x <+0>: xor %eax,%eax 3 0x <+2>: nopw 0x0(%rax,%rax, 1 ) 4 0x <+8>: movaps (%r d i,%rax,1),%xmm0 5 0x c <+12>: maxps (%rdx,%rax,1),%xmm0 6 0x <+16>: movaps %xmm0,(% rdx,%rax, 1 ) 7 0x <+20>: add $0x10,%rax 8 0x <+24>: cmp $0x40000,%rax 9 0x e <+30>: jne 0x < alignedvectoraddition ( f l o a t const, f l o a t const, f l o a 10 0x a0 <+32>: repz r e t q
38 nyní zkusíme tento příklad: 1 for ( i = 0; i < size ; i ++ ) 2 _sum [ i ] = ( ( _sum [ i ] > _v1 [ i ] )? _sum [ i ] + _v1 [ i ] : _sum [ i ] ) ; ukáže se, že toto překladač nedokáže vektorizovat když ale zápis upravíme na tento tvar 1 for ( i = 0; i < size ; i ++ ) 2 _sum [ i ] += ( ( _sum [ i ] > _v1 [ i ] )? _v1 [ i ] : 0 ) ; vektorizace se již provede 1 Dump of assembler code for f u n c t i o n alignedvectoraddition ( float const, float const, float ) : 2 0x <+0>: xor %eax,%eax 3 0x <+2>: nopw 0x0(%rax,%rax, 1 ) 4 0x <+8>: movaps (%r d i,%rax,1),%xmm2 5 0x c <+12>: movaps (%rdx,%rax,1),%xmm1 6 0x <+16>: movaps %xmm2,%xmm0 7 0x <+19>: cmpltps %xmm1,%xmm0 8 0x <+23>: andps %xmm2,%xmm0 9 0x a <+26>: addps %xmm1,%xmm0 10 0x d <+29>: movaps %xmm0,(% rdx,%rax, 1 ) 11 0x a1 <+33>: add $0x10,%rax 12 0x a5 <+37>: cmp $0x40000,%rax 13 0x ab <+43>: jne 0x < alignedvectoraddition ( float const, float const, float )+8> 14 0x ad <+45>: repz r e t q
39 Výpočet sumy: 1 f l o a t alignedvectorsum ( const f l o a t v1 ) 2 { 3 const f l o a t _v1 = ( const f l o a t ) 4 builtin_assume_aligned ( v1, 1 6 ) ; 5 f l o a t y ( 0.0 ) ; 6 for ( i n t i = 0; i < size ; i ++ ) 7 y += _v1 [ i ] ; 8 return y ; 9 } toto překladač vektorizovat neumí důvodem je, že by nedokázal dodržet přesně stejné pořadí, v němž se prvky vektoru sčítají a tím pádem by mohl narušit přesnost výpočtu řešením je použití přepínače -ffast-math
40 ukazuje se, že pro úspěšnou vektorizaci kódu je podstatný tvar těla smyčky pokud překladač nedokáže vektorizaci provést, je dobré se pokusit zapsat výraz jinak můžeme se ale dostat do situace, kdy překladač nedokáže kód vektorizovat vůbec pak musíme vektorizaci provést sami
41 pro vektorizaci svépomocí lze využít tzv. intrinsic instructions jsou definovány v následujících hlavičkových souborech <mmintrin.h> MMX <xmmintrin.h> SSE <emmintrin.h> SSE2 <pmmintrin.h> SSE3 <tmmintrin.h> SSSE3 <smmintrin.h> SSE4.1 <nmmintrin.h> SSE4.2 <ammintrin.h> SSE4A <avxintrin.h> AVX <avx2intrin.h> AVX2 <immintrin.h> obecný
42 tyto instrukce pracují s typy tvaru mxxx[,i,d] kde XXX udává velikost registru, se kterým chceme pracovat XXX = 64,128,256,512 koncovka udává číselný typ nic float i int d double
43 1 f l o a t alignedsum ( f l o a t v, 2 const i n t size ) 3 { 4 m128 s1p = _mm_setzero_ps ( ) ; 5 for ( i n t i = 0; i < size ; i += 4 ) 6 { 7 m128 v1p = _mm_load_ps ( &v [ i ] ) ; 8 s1p = _mm_add_ps ( s1p, v1p ) ; 9 } 10 f l o a t res [ 4 ] a t t r i b u t e ( ( aligned ( 16 ) ) ) ; 11 _mm_store_ps ( res, s1p ) ; 12 return ( res [ 0 ] + res [ 1 ] ) + ( res [ 2 ] + res [ 3 ] ) ; 13 } proměnné s1p a v1p jsou uloženy v XMM registrech a každá obsahuje čtyři hodnoty typu float instrukce _mm_setzero_ps() nuluje XMM registr instrukce _mm_load_ps( float* ) načte do příslušného registru čtyři po sobě jdoucí čísla typu float a adresa prvního musí být dělitelná 16 instrukce _mm_add_ps(_mm128 xmm0, _mm128 xmm1) přičte do registru xmm0 hodnotu z registru xmm1 instrukce _mm_store_ps( float*, _m128 xmm0 ) uloží na danou adresu obsah registru xmm0
44 Vektorizace - shrnutí současné překladače dokáží využít vektorové instrukce dobře někdy je ale potřeba kód vhodně modifikovat to často umožní vektorizaci tam, kde by ji překladač nezvládl provést někdy to může vést k výrazně menšímu strojovému kódu, což může zlepšit efektivitu práce s instrukční cache kód je ovšem méně robustní a náchylnější k chybám v některých případech můžeme být nuceni provést vektorizaci sami pomocí intrinsic instructions vektorizace je velmi důležitá při programování MIC akcelerátorů Xeon Phi
Jan Nekvapil ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE Fakulta elektrotechnická
Jan Nekvapil jan.nekvapil@tiscali.cz ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE Fakulta elektrotechnická Motivace MMX, EMMX, MMX+ 3DNow!, 3DNow!+ SSE SSE2 SSE3 SSSE3 SSE4.2 Závěr 2 Efektivní práce s vektory
IPA - Lab.3 SSE instrukce, zarovnání dat
IPA - Lab.3 SSE instrukce, zarovnání dat Ondřej Klubal http://www.fit.vutbr.cz/~iklubal/ipa/ 2015 Ondřej Klubal IPA - Lab.3 1 / 25 Osnova Data alignment Data alignment ve VS 2010 Příklad na data alignment
Představení a vývoj architektur vektorových procesorů
Představení a vývoj architektur vektorových procesorů Drong Lukáš Dro098 1 Obsah Úvod 3 Historie, současnost 3 Architektura 4 - pipelining 4 - Operace scatter a gather 4 - vektorové registry 4 - Řetězení
Canon Controller. Komunikační protokol. Řídicí jednotka k objektivům Canon EF/EF-S
Řídicí jednotka k objektivům Canon EF/EF-S Komunikační protokol ATEsystem s.r.o. Studentská 6202/17 708 00 Ostrava-Poruba Česká republika M +420 595 172 720 E produkty@atesystem.cz W www.atesystem.cz INFORMACE
OPS Paralelní systémy, seznam pojmů, klasifikace
Moorův zákon (polovina 60. let) : Výpočetní výkon a počet tranzistorů na jeden CPU chip integrovaného obvodu mikroprocesoru se každý jeden až dva roky zdvojnásobí; cena se zmenší na polovinu. Paralelismus
velikost symbol caption znak náhled fontu Bod čs. trigonometrické sítě, bod podrobného 1.01 polohového pole, přidružený bod k bodu čs. trigonometrické sítě nebo k bodu podrobného 0x21 10 polohového pole
Pohled do nitra mikroprocesoru Josef Horálek
Pohled do nitra mikroprocesoru Josef Horálek Z čeho vycházíme = Vycházíme z Von Neumannovy architektury = Celý počítač se tak skládá z pěti koncepčních bloků: = Operační paměť = Programový řadič = Aritmeticko-logická
Sekvenční architektury II. Zpracování instrukcí
Sekvenční architektury II Zpracování instrukcí Jak zvýšit výkon CPU zkrátit čas nutný ke zpracování 1 instrukce urychlit časovač (Timer) = zvýšení taktu to je technicky velmi náročné, poslední dobou se
Algoritmizace a programování
Algoritmizace a programování Výrazy Operátory Výrazy Verze pro akademický rok 2012/2013 1 Operace, operátory Unární jeden operand, operátor se zapisuje ve většině případů před operand, v některých případech
Paralelní a distribuované výpočty (B4B36PDV)
Paralelní a distribuované výpočty (B4B36PDV) Branislav Bošanský, Michal Jakob bosansky@fel.cvut.cz Artificial Intelligence Center Department of Computer Science Faculty of Electrical Engineering Czech
Optimalizace pomocí icc/gcc - vektorizace
Optimalizace pomocí icc/gcc - vektorizace ICC/ICPC ICC/ICPC - překladače pro jazyky C/C++ od firmy Intel ke stažení po registraci na http://www.intel.com/cd/software/products/asmona/eng/compilers/clin/219856.htm
Opakování programování
Opakování programování HW návaznost - procesor sběrnice, instrukční sada, optimalizace rychlosti, datové typy, operace (matematické, logické, podmínky, skoky, podprogram ) - paměti a periferie - adresování
x86 assembler and inline assembler in GCC
x86 assembler and inline assembler in GCC Michal Sojka sojkam1@fel.cvut.cz ČVUT, FEL License: CC-BY-SA 4.0 Useful instructions mov moves data between registers and memory mov $1,%eax # move 1 to register
Intel 80486 (2) Intel 80486 (1) Intel 80486 (3) Intel 80486 (4) Intel 80486 (6) Intel 80486 (5) Nezřetězené zpracování instrukcí:
Intel 80486 (1) Vyroben v roce 1989 Prodáván pod oficiálním názvem 80486DX Plně 32bitový procesor Na svém čipu má integrován: - zmodernizovaný procesor 80386 - numerický koprocesor 80387 - L1 (interní)
Technologie Intel SSE I. Šimeček, J. Trdlička
Technologie Intel SSE I. Šimeček, J. Trdlička xsimecek@fit.cvut.cz Katedra počítačových systémů FIT České vysoké učení technické v Praze Ivan Šimeček, 2011 MI-PAP, LS2010/11, Predn.2 Příprava studijního
Procesor Intel Pentium (1) Procesor Intel Pentium (3) Procesor Intel Pentium Pro (1) Procesor Intel Pentium (2)
Procesor Intel Pentium (1) 32-bitová vnitřní architektura s 64-bitovou datovou sběrnicí Superskalární procesor: obsahuje více než jednu (dvě) frontu pro zřetězené zpracování instrukcí (značeny u, v) poskytuje
Strojový kód. Instrukce počítače
Strojový kód Strojový kód (Machine code) je program vyjádřený v počítači jako posloupnost instrukcí procesoru (posloupnost bajtů, resp. bitů). Z hlediska uživatele je strojový kód nesrozumitelný, z hlediska
Přehled paralelních architektur. Dělení paralelních architektur Flynnova taxonomie Komunikační modely paralelních architektur
Přehled paralelních architektur Přehled paralelních architektur Dělení paralelních architektur Flynnova taxonomie Komunikační modely paralelních architektur Přehled I. paralelní počítače se konstruují
Pokročilé architektury počítačů
Pokročilé architektury počítačů Tutoriál 3 CUDA - GPU Martin Milata Výpočetní model CUDA Organizace kódu Sériově organizovaný kód určený pro CPU Paralelní kód prováděný na GPU Označuje se jako kernel GPU
Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague
Tomáš Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague Zjednodušené schéma systému z základ hardware pro mainframe tvoří: operační pamět - MAIN / REAL STORAGE jeden
Charakteristika dalších verzí procesorů v PC
Charakteristika dalších verzí procesorů v PC 1 Cíl přednášky Poukázat na principy tvorby architektur nových verzí personálních počítačů. Prezentovat aktuální pojmy. 2 Úvod Zvyšování výkonu cestou paralelizace
Strojový kód k d a asembler procesoru MIPS SPIM. MIPS - prostředí NMS NMS. 32 ks 32bitových registrů ( adresa registru = 5 bitů).
Strojový kód k d a asembler procesoru MIPS Použit ití simulátoru SPIM K.D. - cvičení ÚPA 1 MIPS - prostředí 32 ks 32bitových registrů ( adresa registru = 5 bitů). Registr $0 je zero čte se jako 0x0, zápis
Obecné výpočty na GPU v jazyce CUDA. Jiří Filipovič
Obecné výpočty na GPU v jazyce CUDA Jiří Filipovič Obsah přednášky motivace architektura GPU CUDA programovací model jaké algoritmy urychlovat na GPU? optimalizace Motivace Moorův zákon stále platí pro
Sekvenční architektury II. Zpracování instrukcí
Sekvenční architektury II Zpracování instrukcí Jak zvýšit výkon CPU zkrátit čas nutný ke zpracování 1 instrukce urychlit časovač (Timer) = zvýšení taktu to je technicky velmi náročné, poslední dobou se
1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:
1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.
1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:
1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.
Hlavní využití počítačů
Úvod Hlavní využití počítačů Počítače jsou výkonné nástroje využívané pro zpracování dat. Provádějí: načtení a binární kódování dat provedení požadovaného výpočtu zobrazení výsledku Hlavní využití počítačů
CHARAKTERISTIKA MODERNÍCH PENTIÍ. Flynnova klasifikace paralelních systémů
Úvod: CHARAKTERISTIKA MODERNÍCH PENTIÍ Flynnova klasifikace paralelních systémů Paralelní systémy lze třídit z hlediska počtu toků instrukcí a počtu toků dat: SI systém s jedním tokem instrukcí (Single
Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty
Data v počítači Informační data (elementární datové typy) Logické hodnoty Znaky Čísla v pevné řádové čárce (celá čísla) v pohyblivé (plovoucí) řád. čárce (reálná čísla) Povelová data (instrukce programu)
Operační systémy. Cvičení 3: Programování v C pod Unixem
Operační systémy Cvičení 3: Programování v C pod Unixem 1 Obsah cvičení Editace zdrojového kódu Překlad zdrojového kódu Základní datové typy, struktura, ukazatel, pole Načtení vstupních dat Poznámka: uvedené
for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }
5. Operátor čárka, - slouží k jistému určení pořadí vykonání dvou příkazů - oddělím-li čárkou dva příkazy, je jisté, že ten první bude vykonán dříve než příkaz druhý. Např.: i = 5; j = 8; - po překladu
Petr Krajča. 26. říjen, 2012
Operační systémy Řízení výpočtu Petr Krajča Katedra informatiky Univerzita Palackého v Olomouci 26. říjen, 2012 Petr Krajča (UP) KMI/YOS: Přednáška II. 26. říjen, 2012 1 / 18 Reprezentace hodnot záporná
8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek
8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek 1/41 Základní příkazy Všechny příkazy se píšou malými písmeny! Za většinou příkazů musí být středník (;)! 2/41 Základní příkazy
Architektura Intel Atom
Architektura Intel Atom Štěpán Sojka 5. prosince 2008 1 Úvod Hlavní rysem Atomu je podpora platformy x86, která umožňuje spouštět a běžně používat řadu let vyvíjené aplikace, na které jsou uživatelé zvyklí
Další aspekty architektur CISC a RISC Aktuálnost obsahu registru
Cíl přednášky: Vysvětlit principy práce s registry v architekturách RISC a CISC, upozornit na rozdíly. Vysvětlit možnosti využívání sad registrů. Zabývat se principy využívanými v procesorech Intel. Zabývat
8. Laboratoř: Aritmetika a řídicí struktury programu
8. Laboratoř: Aritmetika a řídicí struktury programu Programy v JSA aritmetika, posuvy, využití příznaků Navrhněte a simulujte v AVR studiu prográmky pro 24 bitovou (32 bitovou) aritmetiku: sčítání, odčítání,
C2115 Praktický úvod do superpočítání
C2115 Praktický úvod do superpočítání IX. lekce Petr Kulhánek, Tomáš Bouchal kulhanek@chemi.muni.cz Národní centrum pro výzkum biomolekul, Přírodovědecká fakulta, Masarykova univerzita, Kotlářská 2, CZ-61137
5 Přehled operátorů, příkazy, přetypování
5 Přehled operátorů, příkazy, přetypování Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně budou uvedeny detaily týkající se operátorů. Doba nutná k nastudování
Ivan Šimeček, Pavel Tvrdík
Optimalizace a hodnocení efektivity lineárních kódů Ivan Šimeček, Pavel Tvrdík Department of Computer Science and Engineering Faculty of Electrical Engineering Czech Technical University Karlovo nám. 13
Assembler RISC RISC MIPS. T.Mainzer, kiv.zcu.cz
Assembler RISC T.Mainzer, kiv.zcu.cz RISC RISC, neboli Reduced Instruction Set Computer - koncepce procesorů s redukovaným souborem instrukcí (vs. CISC, neboli Complex Instruction Set Computer, "bohatý"
Struktura a architektura počítačů (BI-SAP) 7
Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Struktura a architektura počítačů (BI-SAP) 7 doc. Ing. Hana Kubátová, CSc. Katedra číslicového návrhu Fakulta informačních technologii
Předmluva 13 Použité konvence 14. KAPITOLA 1 Základní číselné soustavy a pojmy Číselné soustavy a převody 15 1.
7 Předmluva 13 Použité konvence 14 KAPITOLA 1 Základní číselné soustavy a pojmy 15 1.1 Číselné soustavy a převody 15 1.2 Datové typy 18 KAPITOLA 2 Seznámení s mikroprocesory řady x86 21 2.1 Počítač obecně
Assembler - 2.část. poslední změna této stránky: Zpět
1 z 9 19.2.2007 7:51 Assembler - 2.část poslední změna této stránky: 9.2.2007 1. Příznaky (flagy) Zpět Flagy (česky podivně "příznaky", proto používám výhradně anglický název) jsou výlučnou záležitostí
Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague
Assembler pro Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague Zápis instrukcí umíme už zapisovat instrukce v binárním tvaru to je silně nešikovné pro snazší vývoj
Úvod do programovacích jazyků (Java)
Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích
Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo
Operátory, výrazy Tomáš Pitner, upravil Marek Šabo Operátor "Znaménko operace", pokyn pro vykonání operace při vyhodnocení výrazu. V Javě mají operátory napevno daný význam, nelze je přetěžovat jako v
Procesy. Procesy Přepínání kontextu (proc_ctxsw) Postup:
Procesy Procesy Přepínání kontextu (proc_ctxsw) 1. spočítáme si kolikrát ve sledovaném čase (50 ms) byl součet časové kvantum (11ms) + context-switch (2ms) -> (11 + 2) + (11 + 2) + (11 + 2) -> 3x 2. context-switch
Adresní mody procesoru
Adresní mody procesoru K.D. - přednášky 1 Obecně o adresování Různé typy procesorů mohou mít v instrukci 1, 2 nebo více adres. Operandy mohou ležet v registrech nebo v paměti. Adresní mechanismus procesoru
Paralelní programování
Paralelní programování přednáška 5 Michal Krupka 15. března 2011 Michal Krupka (KI UP) Paralelní programování 15. března 2011 1 / 13 Ještě ke kritickým sekcím Použití v praxi obvykle pomocí zámků (locks)
Procesor z pohledu programátora
Procesor z pohledu programátora Terminologie Procesor (CPU) = řadič + ALU. Mikroprocesor = procesor vyrobený monolitickou technologií na čipu. Mikropočítač = počítač postavený na bázi mikroprocesoru. Mikrokontrolér
Uživatelský manuál. KNX232e / KNX232e1k
Uživatelský manuál verze dokumentu 1.2 (pro firmware od verze 2.1) KNX232e / KNX232e1k KNX232e slouží pro ovládání a vyčítání stavů ze sběrnice KNX sériová linka s ASCII protokolem signalizace komunikace
Princip funkce počítače
Princip funkce počítače Princip funkce počítače prvotní úlohou počítačů bylo zrychlit provádění matematických výpočtů první počítače kopírovaly obvyklý postup manuálního provádění výpočtů pokyny pro zpracování
Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague
Aritmetika v Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague Příklad Napíšeme program pro výpočet 54321-12345 dekadicky: 54321-12345=41976 hexadecimálně: x 0000D431
Vektorové instrukční sady a použití assembleru v gcc
Vektorové instrukční sady a použití assembleru v gcc Martin Bruchanov BruXy bruxy@regnet.cz http://bruxy.regnet.cz 23. března 2009 1 Instrukční sady SIMD procesorů x86........................................
Jazyk symbolických adres
Jazyk symbolických adres 1 Proč programovat v JSA Pro některé procesory resp. MCU jsou překladače JSA dostupnější. Některé překladače vyšších jazyků neumí využít určité speciální vlastnosti procesoru.
Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.
Proměnná Pojmenované místo v paměti sloužící pro uložení hodnoty. K pojmenování můžeme použít kombinace alfanumerických znaků, včetně diakritiky a podtržítka Rozlišují se velká malá písmena Název proměnné
Architektury VLIW M. Skrbek a I. Šimeček
Architektury VLIW M. Skrbek a I. Šimeček xsimecek@fit.cvut.cz Katedra počítačových systémů FIT České vysoké učení technické v Praze Ivan Šimeček, 2011 MI-PAP, LS2010/11, Predn.3 Příprava studijního programu
PB071 Programování v jazyce C Jaro 2017
Programování v jazyce C Jaro 2017 Typový systém, Dynamická alokace Typový systém Typový systém - motivace Celé znaménkové číslo se reprezentuje nejčastěji v dvojkovém doplňkovém kódu ival1 = 5 (dvojkový
Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b
Výrazy a operátory i = 2 i = 2; to je výraz to je příkaz 4. Operátory Unární - unární a unární + Např.: +5-5 -8.345 -a +b - unární ++ - inkrement - zvýší hodnotu proměnné o 1 - unární -- - dekrement -
LEKCE 6. Operátory. V této lekci najdete:
LEKCE 6 Operátory V této lekci najdete: Aritmetické operátory...94 Porovnávací operátory...96 Operátor řetězení...97 Bitové logické operátory...97 Další operátory...101 92 ČÁST I: Programování v jazyce
Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/YOS: Přednáška II. 14. říjen, / 26
Operační systémy Řízení výpočtu Petr Krajča Katedra informatiky Univerzita Palackého v Olomouci Petr Krajča (UP) KMI/YOS: Přednáška II. 14. říjen, 2016 1 / 26 Reprezentace hodnot záporná čísla jsou v doplňkovém
Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto
Gymnázium Vysoké Mýto nám. Vaňorného 163, 566 01 Vysoké Mýto Registrační číslo projektu Šablona Autor Název materiálu CZ.1.07/1.5.00/34.0951 III/2 INOVACE A ZKVALITNĚNÍ VÝUKY PROSTŘEDNICTVÍM ICT Mgr. Petr
1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5
Obsah Obsah 1 Programovací jazyk Pascal 1 1.1 Struktura programu v Pascalu.................... 1 2 Proměnné 2 2.1 Vstup a výstup............................ 3 3 Operátory a některé matematické funkce 5
Operační systémy. Cvičení 4: Programování v C pod Unixem
Operační systémy Cvičení 4: Programování v C pod Unixem 1 Obsah cvičení Řídící struktury Funkce Dynamická alokace paměti Ladění programu Kde najít další informace Poznámka: uvedené příklady jsou dostupné
Paralení programování pro vícejádrové stroje s použitím OpenMP. B4B36PDV Paralelní a distribuované výpočty
Paralení programování pro vícejádrové stroje s použitím OpenMP B4B36PDV Paralelní a distribuované výpočty Minulé cvičení: Vlákna a jejich synchronizace v C++ 11... 1 Minulé cvičení: Vlákna a jejich synchronizace
Charakteristika dalších verzí procesorů Pentium
Charakteristika dalších verzí procesorů Pentium 1 Cíl přednášky Poukázat na principy architektur nových verzí typů Pentií. Prezentovat aktuální pojmy. 2 Úvod Paralelní systémy lze třídit z hlediska počtu
Paralelní a distribuované výpočty (B4B36PDV)
Paralelní a distribuované výpočty (B4B36PDV) Branislav Bošanský, Michal Jakob bosansky@fel.cvut.cz Artificial Intelligence Center Department of Computer Science Faculty of Electrical Engineering Czech
Sada 1 - Základy programování
S třední škola stavební Jihlava Sada 1 - Základy programování 04. Datové typy, operace, logické operátory Digitální učební materiál projektu: SŠS Jihlava šablony registrační číslo projektu:cz.1.09/1.5.00/34.0284
Paralelní a distribuované výpočty (B4B36PDV)
Paralelní a distribuované výpočty (B4B36PDV) Branislav Bošanský, Michal Jakob bosansky@fel.cvut.cz Artificial Intelligence Center Department of Computer Science Faculty of Electrical Engineering Czech
Paměť počítače. alg2 1
Paměť počítače Výpočetní proces je posloupnost akcí nad daty uloženými v paměti počítače Data jsou v paměti reprezentována posloupnostmi bitů (bit = 0 nebo 1) Připomeňme: paměť je tvořena řadou 8-mi bitových
Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15
Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 KAPITOLA 1 Úvod do programo vání v jazyce C++ 17 Základní pojmy 17 Proměnné a konstanty 18 Typy příkazů 18 IDE integrované vývojové
Jako pomůcka jsou v pravém dolním rohu vypsány binární kódy čísel od 0 do 15 a binární kódy příkazů, které máme dispozici (obr.21). Obr.
Model procesoru Jedná se o blokové schéma složené z registrů, paměti RAM, programového čítače, instrukčního registru, sčítačky a řídicí jednotky, které jsou propojeny sběrnicemi. Tento model má dva stavy:
09. Memory management. ZOS 2006, L.Pešička
09. Memory management ZOS 2006, L.Pešička Správa paměti paměťová pyramida absolutní adresa relativní adresa počet bytů od absolutní adresy fyzický prostor adres fyzicky k dispozici výpočetnímu systému
4-1 4. Přednáška. Strojový kód a data. 4. Přednáška ISA. 2004-2007 J. Buček, R. Lórencz
4-4. Přednáška 4. Přednáška ISA J. Buček, R. Lórencz 24-27 J. Buček, R. Lórencz 4-2 4. Přednáška Obsah přednášky Násobení a dělení v počítači Základní cyklus počítače Charakteristika třech základní typů
Algoritmizace a programování
Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu
Simulátory aplikačně specifických instrukčních procesorů Jazyk LISA. Masařík Karel (masarik@fit.vutbr.cz)
Simulátory aplikačně specifických instrukčních procesorů Jazyk LISA Masařík Karel (masarik@fit.vutbr.cz) 1. Úvod Vestavěný systém Jednoúčelový systém, ve kterém je řídicí počítač zcela zabudován do zařízení,
GPU A CUDA HISTORIE GPU CO JE GPGPU? NVIDIA CUDA
GPU A CUDA HISTORIE GPU CO JE GPGPU? NVIDIA CUDA HISTORIE GPU GPU = graphics processing unit jde o akcelerátory pro algoritmy v 3D grafice a vizualizaci mnoho z nich původně vzniklo pro účely počítačových
MSP 430F1611. Jiří Kašpar. Charakteristika
MSP 430F1611 Charakteristika Mikroprocesor MSP430F1611 je 16 bitový, RISC struktura s von-neumannovou architekturou. Na mikroprocesor má neuvěřitelně velkou RAM paměť 10KB, 48KB + 256B FLASH paměť. Takže
ARCHITEKTURA PROCESORŮ
ARCHITEKTURA PROCESORŮ Základními jednotkami, které tvoří vnitřní strukturu procesorů, jsou: řadič, který má za úkol číst operandy (data, čísla) a instrukce z operační paměti, dekódovat je a na základě
Programovací jazyk C++ Hodina 1
Programovací jazyk C++ Hodina 1 Používané překladače Bloodshed Dev C++ http://www.bloodshed.net/devcpp.html CodeBlocks http://www.codeblocks.org pokud nemáte již nainstalovaný překladač, stáhněte si instalátor
PB071 Programování v jazyce C Jaro 2015
Programování v jazyce C Jaro 2015 Argumenty main(), Typový systém, Dynamická alokace Organizační Polosemestrální test Úterý 7. dubna v 10:00 a 11:00 v D1 20 bodů rozdíl mezi E a C Zdroj: http://www.bugemos.com/?node=342
Úvod do programování. Lekce 1
Úvod do programování Lekce 1 Základní pojmy vytvoření spustitelného kódu editor - psaní zdrojových souborů preprocesor - zpracování zdrojových souborů (vypuštění komentářů atd.) kompilátor (compiler) -
Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/YOS: Přednáška I. 10. 10. 2014 1 / 21
Operační systémy Úvod do Operačních Systémů Petr Krajča Katedra informatiky Univerzita Palackého v Olomouci Petr Krajča (UP) KMI/YOS: Přednáška I. 10. 10. 2014 1 / 21 Organizační informace email: petr.krajca@upol.cz
Assembler - 5.část. poslední změna této stránky: Zpět
1 z 5 19.2.2007 7:52 Assembler - 5.část poslední změna této stránky: 9.2.2007 1. Pseudoinstrukce a direktivy Zpět Kromě instrukcí můžete v Assembleru psát také další konstrukce, které se obšem nepřekládají
C# konzole Podíl dvou čísel, podmínka IF
C# konzole Podíl dvou čísel, podmínka IF Tematická oblast Datum vytvoření 2013 Ročník 3 Stručný obsah Způsob využití Autor Kód Internetové technologie, programování Výpočet podílu v konzolové aplikaci
Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false
Logické operace Datový typ bool může nabýt hodnot: o true o false Relační operátory pravda, 1, nepravda, 0, hodnoty všech primitivních datových typů (int, double ) jsou uspořádané lze je porovnávat binární
Co je grafický akcelerátor
Co je grafický akcelerátor jednotka v osobním počítači či herní konzoli přebírá funkce hlavního procesoru pro grafické operace graphics renderer odlehčuje hlavnímu procesoru paralelní zpracování vybaven
IUJCE 07/08 Přednáška č. 6
Správa paměti Motivace a úvod v C (skoro vždy) ručně statické proměnné o datový typ, počet znám v době překladu o zabírají paměť po celou dobu běhu programu problém velikosti definovaných proměnných jak
PROCESOR. Typy procesorů
PROCESOR Procesor je ústřední výkonnou jednotkou počítače, která čte z paměti instrukce a na jejich základě vykonává program. Primárním úkolem procesoru je řídit činnost ostatních částí počítače včetně
Reprezentace dat v informačních systémech. Jaroslav Šmarda
Reprezentace dat v informačních systémech Jaroslav Šmarda Reprezentace dat v informačních systémech Reprezentace dat v počítači Datové typy Proměnná Uživatelské datové typy Datové struktury: pole, zásobník,
Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr
Bitové operátory a bitová pole Úvod do programování 2 Tomáš Kühr Bitové operátory Provádějí danou operaci s jednotlivými bity svých operandů Operandy bitových operátorů mohou být pouze celočíselné Vyhodnocení
Využití ICT pro rozvoj klíčových kompetencí CZ.1.07/1.5.00/
Střední odborná škola elektrotechnická, Centrum odborné přípravy Zvolenovská 537, Hluboká nad Vltavou Využití ICT pro rozvoj klíčových kompetencí CZ.1.07/1.5.00/34.0448 CZ.1.07/1.5.00/34.0448 1 Číslo projektu
ZADÁNÍ Č. 6 ZÁPADOČESKÁ UNIVERZITA V PLZNI FAKULTA APLIKOVANÝCH VĚD KATEDRA INFORMATIKY A VÝPOČETNÍ TECHNIKY
ZÁPADOČESKÁ UNIVERZITA V PLZNI FAKULTA APLIKOVANÝCH VĚD KATEDRA INFORMATIKY A VÝPOČETNÍ TECHNIKY SEMESTRÁLNÍ PRÁCE Z PŘEDMĚTU KIV/UPA 3. ÚLOHA ZADÁNÍ Č. 6 PETR THÜR 10.12.2006 A04236 FAV INIB/INF PETR.THUR@POST.CZ
Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické
Jak v Javě primitivní datové typy a jejich reprezentace BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické Obsah Celočíselný datový typ Reálný datový typ Logický datový typ, typ Boolean
PROCESOR. Rozdělení procesorů
PROCESOR Procesor je ústřední výkonnou jednotkou počítače, která čte z operační paměti (resp. CACHE paměti) instrukce a na jejich základě vykonává program. Primárním úkolem procesoru je řídit činnost ostatních
Hardware - komponenty počítačů Von Neumannova koncepce počítače. Von Neumannova koncepce počítače
V roce 1945 vystoupil na přednášce v USA matematik John von Neumann a představil architekturu samočinného univerzálního počítače (von Neumannova koncepce/schéma/architektura). Základy této koncepce se
ISU Cvičení 3. Marta Čudová
ISU Cvičení 3 Marta Čudová Supercomputing Technologies Research Group Brno University of Technology, Faculty of Information Technology Božetěchova 1/2, 612 66 Brno - Královo Pole icudova@fit.vutbr.cz Program
Aritmetické operace a obvody pro jejich realizaci
Kapitola 4 Aritmetické operace a obvody pro jejich realizaci 4.1 Polyadické číselné soustavy a jejich vlastnosti Polyadické soustavy jsou určeny přirozeným číslem z, kterému se říká základ nebo báze dané
Výčtový typ strana 67
Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce
Assembler DRUHÁ ČÁST OBSAH.
DRUHÁ ČÁST OBSAH. 1. Knihovny DLL obecný popis. 2. Statické knihovny Dll - výstupní soubor.lib 3. Připojení statické knihovny do konzolové aplikace. 4. Tvorba vlastních API ve statické knihovně a připojení