Architektura jádra Zen podrobně: hledání rovnováhy a přiblížení Intelu

0

Minulý týden jste si mohli přečíst
první
technický pohled na procesorové jádro Zen
. To je
nejzásadnějším počinem, s kterým firma přišla od
příchodu Bulldozeru – zcela od základu novou architekturou
CPU, nadto s úkolem zásadně zvrátit konkurenceschopnost
a finanční zdraví svého tvůrce. Šlo nicméně jen
o ochutnávku, neboť většinu informací si AMD schovalo až
na prezentaci na konferenci Hot Chips 28. Z ní nyní máme
detailní přehled celého jádra Zen a základní jednotky,
tzv. Core Complexu, z nějž se odvozená CPU a APU budou
skládat. Zatímco minule to bylo spíše povrchní, tentokrát AMD
o samotné architektuře řeklo skoro vše, co o ní
sděleno kdy bude.

 

AMD Zen 


Ještě než k detailům přejdeme,
však něco ke „koncepci“ celé architektury, jak ji inženýři
AMD charakterizovali. Mike Clark z týmu pracujícího na Zenu
uvedl, že toto pojmenování má vyjadřovat „rovnováhu“, což
byl při návrhu ústřední cíl. Jádro je údajně navrženo tak,
aby ideálně spojovalo všechny možné cíle – tedy výkon,
dosažitelné frekvence, funkce a instrukční schopnosti
a spotřebu. To také zřejmě znamená, že kompromis těchto
faktorů může jednotlivé vlastnosti držet níže, než kam by je
pustila architektura soustředící se právě na ten daný aspekt,
například vysokou frekvenci jako Bulldozer.

Výjimku a přednost možná měla
jen jedna věc – od základu byly údajně u všech
rozhodnutí brány v potaz otázky spotřeby, které
v předchozích architekturách přicházely až v druhém
sledu, nikoliv hned při prvním koncipování jejího fungování.
Spotřeba nicméně dnes determinuje i dosažitelný výkon,
jelikož TDP jsou omezená, takže prioritizovat efektivitu by dávalo
smysl.

 

Zen má být zároveň náhrada za úsporný Jaguar (křivka vlevo) i výkonný Excavator (vpravo)
Zen má být zároveň náhrada za úsporný Jaguar (křivka vlevo) i výkonný Excavator (vpravo)

Zastaň kočku i bagr!

Kromě toho AMD uvedlo ještě jeden
záměr při návrhu čipu. Zen je podle něj náhrada jak „velkých
jader“ rodiny Bulldozer, která operovala s větším
absolutním výkonem, ale také s větší spotřebou, tak
i úsporných „malých jader“ Bobcat, Jaguar a tak
dále, která jsou úspornější, ale také slabší. Zen má naopak
pokrýt celou škálu těchto využití a být použitelný jak
při TDP Jaguaru, tak Excavatoru, přičemž má obě jádra v těchto
situacích kvalitativně překonávat. A to nejen výkonem, ale i efektivitou.

 

Schéma jádra Zen (Hot Chips 28)
Schéma jádra Zen (Hot Chips 28)

 

Jádro podrobně

Nyní už tedy k architektuře
jádra samotného. To je stavěno na podstatně vyšší výkon při
stejném taktu – orientačně má být o 40% výkonnější
než Excavator, což je nejaktuálnější derivát Bulldozeru.

Pokud budeme sledovat jádro z hlediska
změn proti dnešní architektuře, pak začneme hned ve „frontendu“.
Jádro Zen má stále čtyři dekodéry, proti Excavatoru ale výkon
zvýší tzv. „Op Cache“ či „Micro-Op Cache“, která je
novinkou (Intel ji však má od Sandy Bridge) a ukládá již
dekódované instrukce. V případě, že pro danou instrukci
v kódu existuje protějšek v cache dříve dekódovaných
micro opů, může být dekódování přeskočeno. Zda je toto
možné, pozná procesor podle micro tagů, přidělených kódu
v předchozí fázi zpracování, tzv. „Fetch“, kdy si
procesor bere postupně kód programu z instrukční L1 cache.

Zen: frontend, fáze Fetch
Zen: frontend, fáze Fetch

I fáze Fetch (která při zpracování
předchází dekódování) jinak přináší některá zlepšení,
například zde procesor má vylepšené předpovídání větvení.
Prediktory se vyvíjejí kontinuálně, a proto je firmy
vylepšují prakticky každou novou generaci. K dispozici jsou
mu „velké“ (konkrétní kapacitu ale neznáme) branch target
buffery, přičemž pro každou položku v nich umí procesor
řešit dvě větvení. Procesor také dokáže předvídat, kam
program skočí při návratu ze subrutiny pomocí tzv. „Return
Stacku“, do nějž může mít uloženo 32 jednotlivých záznamů.
Obě opatření by měla pomáhat jednovláknovému výkonu.

Do fronty Micro-opů následující po
fázi Decode, tedy dekódovaných instrukcí, které jsou již
převedené z x86 na interní sadu CPU, podle situace jde buď
nově dekódovaná instrukce z dekodérů, nebo (což zpracování
urychlí a ušetří elektřinu) z Op Cache. Při využití
obou zdrojů to může být šest instrukcí, tedy o polovinu
více, než v Excavatoru. Podle AMD je Op cache jedno
z nejdůležitějších zlepšení, právě tím, jak zvedá
výkon a snižuje spotřebu.

Zen: fáze dekódování instrukcí
Zen: fáze dekódování instrukcí

V následující části
zpracování, frontě Micro-Op Queue a poté fázi „Dispatch“
následují další zlepšení. První spočívá v účinnější
technice Store to Load Forwarding. Procesor sleduje, zda není
zapisováno na místo v paměti, odkud poté bude znovu čteno.
V takovém případě je totiž možno čtení přeskočit
a předat rovnou hodnotu, mezitím uloženou v zvláštním
paměťovém souboru procesoru.

Další paměť je pak integrována
pro potřeby tzv. „Stack Engine“. To je struktura, která by si měla pamatovat poslední adresy v paměti a umožňovat úspornou práci s adresami, takže procesor nemusí provádět náročné operace pomocí AGU a load/store pipeline.
Cílem je opět omezit drahé a energeticky náročné přenosy
dat. Propustnost zpracování zde také vylepšuje technika Branch
Fusion, kdy jsou větvení sbalena dohromady s další
instrukcí.

Architektura Zen: frontend

Hlavní svaly Zenu, výpočetní
jednotky

Zatímco předchozí fáze provádění
kódu na papíře moc dobru představu o schopnostech procesoru
nedávají, lepší perspektivu nám předestře samotná vykonávací
část, kam z fáze Dispatch může proudit až deset instrukcí
za takt – šest do celočíselné části, čtyři do FPU.
Jádro sestává ze čtyř ALU, tedy jednotek vykonávajících
aritmetické a logické operace s celými čísly, dvou AGU
zpracovávajících adresy, čtení a zápis do paměti/cache
a čtyř pipeline v FPU. Naproti tomu Excavator měl ALU
jen dvě a v FPU pipeline tři, ale sdílené pro dvě
jádra – výpočetních prostředků je tedy v Zenu
mnohem více.

 

Rozdělené schedulery místo unifikovaného

Zen je specifický tím, že má proti
Jaguaru nebo Bulldozeru/Excavatoru v celočíselné části
vyhrazené shedulery pro jednotlivé ALU a AGU. Dispatch tedy
instrukce posílá do celkem šesti schedulerů o 14 položkách,
které pak pracují nezávisle, zatímco fronta Retire, kterou
výpočty končí, je poté již unifikovaná a má hloubku 192
položek (a dokáže zpracovat až 8 instrukcí za takt
proti čtyřem u Excavatoru).

Rozdělené schedulery, které
připomínají architektury K7 až K10, nejsou tak pružné, ale mají
jednu výhodu – AMD je údajně může jednotlivě odpojovat
od hodinového signálu (tzv. clock gating, který je agresivně
používán po celém jádru) a šetřit tak energii. Pokud se
kapacity schedulerů sečtou, mají tyto fronty 84 položek proti 48
u Excavatoru, přičemž platí, že čím víc, tím lepší
schopnosti přehazovat instrukce a vydřít z kódu více práce
na jeden cyklus.

Celočíselná část výpočetních jednotek
Celočíselná část výpočetních jednotek

Jednotlivé ALU jsou víceméně
symetrické pokud jde o většinu instrukcí. Násobení celých
čísel (IMUL) lze ovšem vykonat jen v jedné z nich,
podobně například instrukci CRC32. Větvení je také posíláno
jen do dvou ze čtyř ALU. Zbytek operací ale zastanou všechny. ALU
používají techniku elminace MOVů (tedy přesunů dat mezi
registry) díky použití fyzického souboru registrů, což ovšem
není u AMD nová věc. Soubor registrů má kapacitu 168
položek, dostupných pro držení, kopírování a přejmenovávání
architektonických registrů, jak to vyžaduje out-of-order
vykonávání kódu.

Dvě AGU dokáží provést dvě
128bitové čtecí operace nebo jeden zápis. Zpracování je stylem
out-of-order, kdy ve frontě může být až 72 čtecích operací
a ve frontě zápisů až 44 operací. Zde je možná určitá
nerovnováha, neboť u K10 i Bulldozeru až Excavatoru (ale
i Jaguaru) byl poměr ALU a AGU vždy 1:1. Pro více AGU
ale možná v architektuře Zen nezbylo místo, nebo (zatím)
nenastal čas – možná, že přibudou v některém z budoucích
následníků.

Systém AGU a Load/Store
Systém AGU a Load/Store

 

FPU opět oddělená

FPU je oddělená, AMD u ní
zachovalo svůj typický „koprocesorový model“. Má svůj
vlastní scheduler, jenž tvoří dva stupně fronty (NSQ a SQ), což umožňuje
předem získat některé informace pro další zpracování v NSQ, než začne skutečný scheduling v SQ. FPU má
i vlastní soubor registrů (neboť instrukce SIMD pracují se
zvláštní sadou architektonických registrů yMM a xMM).
Scheduler je tentokrát unifikovaný, s hloubkou 96 proti 60
položkám u Excavatoru. AMD uvádí, že by mělo
být rychlejší čtení dat do FPU – z paměti cache se dostanou
za 7 cyklů, u buldozerů to bylo 9 cyklů. FPU
dokáže ukládat za takt jednou 128 bitů.

Samotné výpočetní pipeline jsou
čtyři, dvakrát „ADD“ a dvakrát „MUL“. Jejich
vektorová šířka je 128bitů, takže v jednom průchodu
zvládají instrukce SSE, ale na 256bitové AVX(2) potřebují
průchody dva (Zen z nich dělá dva Micro-Opy). V jednotkách
MUL je možno vykonat i instrukce FMAC kombinující násobení
a sčítání (FPU tedy zvládá dvě za takt). V případě,
že všechny vstupy má tato pipeline lokálně přítomné, není
zpracováním FMAC zaměstnána žádná další jednotka, pokud je
však třeba vstup získat z některé další pipeline,
k jejímu obsazení dochází. Za příznivé konstelace je však
možné provést dvojici FMAC a dvojici sčítání naráz.

FPU Zenu
FPU Zenu

FPU podporuje instrukce x87, MMX,
SSE–SSE4, AVX a AVX2, FMA3, BMI1 a BMI2 a nově SHA
(přesněji SHA1 a SHA256). Také šifrování přes AES by mělo
být posíleno, každé jádro má v FPU dvě jednotky. Jádro
podporuje i další nové, avšak asi nikoli světoborné
instrukce, viz tabulku níže. Některé instrukce byly ovšem odebrány: Zen na rozdíl od Bulldozeru a potomků neumí rozšíření XOP či TBM, specifické pro AMD a nepodporované Intelem.

 

Celkově by FPU měla podávat
podstatně vyšší výkon, jelikož je nyní určena pro jediné
jádro, zatímco v derivátech Bulldozeru měl obdobné
prostředky (při kratších out-of-order bufferech) společně
k dispozici modul o dvou jádrech. Důležité budou
latence jednotlivých instrukcí, které ještě neznáme, vzhledem
k tomu, že Zen míří na konzervativnější takty, by ale
i u nich mohlo teoreticky dojít ke zlepšení (to ale
teprve uvidíme).

Nové instrukce podporované architekturou Zen
Nové instrukce podporované architekturou Zen

 

Out-of-order buffery v porovnání
se Skylake

Zde by se možná mohla udělat malá
odbočka. Asi si moc nedovete představit, zda jsou různé hloubky
bufferů a front, které jsme na základě materiálů
zveřejněných AMD popisovali, velké, či malé. Můžete je
srovnat s údaji v následující tabulce, které Intel
uvídí pro svá CPU. Čísla se poměrně blíží out-of-order
hloubce jádra Skylake, scheduler s dohromady 84 položkami
(ovšem rozdělenými do 6 front) je proti 97 u aktuálního
Intelu menší, AMD ale zase má zvlášť scheduler pro FPU
o hloubce 96. Fronta pro čtení je stejně dlouhá (72), pro
zápis však kratší (44 proti 56 položkám). Kapacity registrových
souborů jsou podobné: Zen 168/160, Skylake 180/168.

Hloubky front a bufferů u procesorů Intel
Hloubky front a bufferů u procesorů Intel

Reparát z cache, SMT a ideové vyznění díla

Jedno ze zásadních zlepšení je pro
Zen očekáváno, slíbeno – a doufejme, že i naplněno –
v hierarchii mezipamětí cache, považované obecně za problém
Bulldozeru a následníků. AMD v zveřejněném popisu
Zenu avizuje notná zlepšení. L3 má údajně mít celkově
pětinásobnou propustnost (dohromady pro všechna jádra), L1 a L2
cache údajně dvojnásobnou, což je už kapacita pro jediné jádro.
Lepší má být údajně latence i prefetching.

Kapacity a asociativity již známe
z minula, nicméně pro připomenutí: L1 je tradičně
rozdělená na datovou a instrukční část. Instrukční L1 má
64 KB (jako v K7–K10) a je čtyřcestně asociativní,
jádro z ní může číst 32 bytů za takt. Datová L1 cache má
poloviční kapacitu (32 KB), ale asociativita je osmicestná (opět
platí, že čím více, tím lépe, umožňuje to flexibilněji
kombinovat přechovávaná data). Podporuje dvě 128bitové (16 B)
čtení či jeden stejně velký zápis. Tyto šířky jsou
optimalizovány pro instrukce SSE, podobně jako FPU, 256bitové
cesty by byly náročnější na spotřebu. Důležitá změna je, že
L1 datová cache je nyní opět lepšího typu „write-back“,
nikoliv jednoduší „write-through“ Bulldozerů. To vylepšuje
výkon zápisu jak pro L1, tak pro L2 cache.

Hierarchie pamětí cache v Zenu
Hierarchie pamětí cache v Zenu

L2 cache komunikuje s L1 cache
rychlostí 32 bytů za takt, totéž pak s L3 cache. L2 je
stejně jalo L1 privátní pro každé jádro a má kapacitu 512
KB, což je návrat k architektuře K10 čipů Phenom I a II
a dvojnásobek proti 256KB L2 jader Nehalem až Skylake od
Intelu. Asociativita je osmicestná. L3 cache je již sdílená
a šestnácticestně asociativní, její kapacita je 8 MB.
Není inkluzivní, jde o tzv. „victim cache“, do níž
putují data, která jednotlivá jádra vyhodila ze své L2. Pro
účely celkové kapacity pro data se tedy kapacity L2 a L3
sčítají.

 

Základní jednotka: Core Complex

S L3 cache úzce souvisí
organizace jader v celém procesoru. Bylo řečeno, že L3 je
sdílená, důležité ovšem je dodat, čím vším sdílená.
Architektura Zen organizuje jádra do základní stavební jednotky,
tzv. „CPU Complexu“ či „Core Complexu“ (CCX). Tento základní
stavební prvek, jenž je vidět i na pokoutně
uvolněném snímku čipu z května
, je složen ze čtyř
jader a jedné L3 cache. Čtyři bloky, z nichž je
složena, mají pro jednotlivá jádra různou přístupovou latenci
dle „vzdálenosti“, zprůměrovaně je ale latence pro všechna
jádra stejná a každé jádro má přístup do celé kapacity.

Core Complex (CCX), stavební základ procesorů architektury zen
Core Complex (CCX), stavební základ procesorů architektury zen

Pro potřeby řízení spotřeby má L3
cache separátní taktování, v čipech patrně poběží na
odlišném taktu proti jádrům. Ta by v rámci jednoho CCX měla
mít zdroj taktu společný, takže CPU bude měnit frekvenci těchto
čtyř jader naráz. Pokud některá jádra nebudou vytížená,
budou pro zmírnění své spotřeby používat techniky jako clock
gating.

Čipy na nerozřezaném waferu
Čipy Summit Ridge na nerozřezaném waferu. Dvojice CCX je dobře vidět

Již víme, že desktopový čip Summit
Ridge bude mít jader osm, zatímco připravované
APU Raven Ridge
čtyři. Druhý čip tak bude mít jen jeden CCX
a jednu L3 cache, ovšem Summit Ridge bude složeno ze dvou
těchto jednotek. To znamená, že toto osmijádro má L3 cache
o celkové kapacitě 16 MB, avšak ve dvou částech. AMD nám
potvrdilo, že obě CCX na čipu komunikují vnitřní propojovací
logikou procesoru (která je koherentní), na níž „sedí“ také
paměťový řadič, severní/jižní můstek a další
komponenty. Do L3 cache druhého komplexu tedy jádra nevidí, musí
si data z ní vyžádat a přesunout k sobě podobně
jako ve víceprocesorovém systému.

 

SMT: někdy se vlastní cesta nevyplácí

Nakonec povídání nám zbyla věc,
která bude na Zenu možná jedna z těch nejpřelomovějších,
tedy podpora pro zpracovávání dvou vláken v jednom jádře.
AMD tuto schopnost dle obecných zvyklostí nazývá SMT (Simultaneous Multi-Threading), od Intelu
ale tuto techniku známe jako HT neboli Hyper Threading (měla ji Pentia 4, in-order
Atomy a od Nehalemu všechna „velká jádra“ Intelu). SMT
dokáže zvýšit celkový výkon podávaný procesorem a čipu
umožňuje konkurovat hypotetickému podobnému CPU s větším
počtem jader, avšak bez SMT.

SMT využívá toho, že plně vytížené
superskalární jádro nevyužívá téměř nikdy všech výpočetních
kapacit, některé zůstávají volné. Tento nevyužitý výkon je
možno částečně dostat zpět – často jde o desítky
procent navíc – pokud čipu umožníte zpracovávat instrukce
paralelně ze dvou vláken. Efektivní je to zejména širokých
jádrech s potenciálně vysokým IPC, Zen se čtyřmi ALU
a čtyřmi pipeline v FPU je tedy dobrým kandidátem.

AMD představilo některé aspekty
toho, jak bude jeho implementace SMT fungovat. Zen podporuje stejně
jako Intel dvoucestný SMT. Podle slajdů by všechny komponenty
jádra měly být sdílené. Vlákna tak nemají některé jednotky
zduplikovány pro sebe a při deaktivovaném SMT může jedno
vlákno používat zcela všechny zdroje. Velká část komponent je
sdílena „kompetitivně“ bez staticky přidělených částí,
takže co nevyužije jedno vlákno, může sebrat druhé – to
je příklad například schedulerů, vykonávacích jednotek, cache,
dekodérů či registrů. Napevno rozdělené jsou při SMT jen
fronta Retire, Micro-Op Queue a fronta zápisů. Důvodem je, že
jejich dynamické rozdělení by příliš zvýšilo komplexnost
jádra.

Charakter sdílení bloků při aktivním SMT (Hot Chips 28)
Charakter sdílení bloků při aktivním SMT (Hot Chips 28)

Některé struktury (TLB, fronta čtení)
použávají „tagování“ jednotlivých vláken, čímž lze jednomu či druhému udělit prioritu. Pro část bloků je pak využito sdílení,
kde procesor rozdělení prostředků aktivně řídí určitými
přednastavenými algoritmickými prioritami a může tedy první nebo druhé
vlákno zvýhodnit tak, aby byl zajištěn lepší celkový výkon (například pookud je třeba se rychle zotavit ze špatně odhadnutého větvení).
Tyto priority se týkají například sekce Dispatch, rozdělující
práci do jednotlivých schedulerů, nebo prediktoru větvení. Tento systém ovšem není propojen s prioritami procesů, které
přiděluje operační systém na softwarové rovině, což by snad měly umožňovat struktury, používající tagování.

SMT je poměrně fundamentální změna
proti rodině Bulldozer. Ta byla také zaměřena na zvýšení
vícevláknového výkonu, ovšem modulární architektura také
zvaná „CMT“ to realizuje sdílením prostředků a replikací
jiných, čímž dokáže zvýšit počet jader možných v určité
ploše křemíku. Nevýhoda je, že přístup CMT poškozuje
jednovláknový výkon, jednotlivá jádra jsou totiž slabší.
Použitím jednoho velkého jádra, které dynamicky mohou sdílet
dvě vlákna, se ovšem podpoří zároveň jak celkový výkon pro
obě jádra, tak i výkon pro jediné vlákno. SMT tedy
uspokojuje oba kardinální požadavky a Zen by díky němu měl
být podstatně všestranější než Excavator. Zároveň se tím značně přiblíží Intelu, který tento recept používá léta.

 

 

Výhled na reálný úspěch?

Není možné ještě architekturu Zen
nějak zodpovědně zhodnotit jen z těchto „papírových“
parametrů, jelikož výkon čipu může omezovat spousta faktorů,
které nelze snadno předvídat. Čistě z popsaných vlastností
tedy nelze příliš usoudit, jak konkurenceschopný Zen bude. Lze
asi říct, že AMD má potenciál ke slušnému IPC. Čtyři ALU
například odpovídají Haswellu, Broadwellu či Skylake.

Některé slabiny se však předpokládat
dají. V prvé řadě je procesor se svými 128bitovými
datovými cestami a FPU stavěn na práci s instrukcemi
SSE–SSE4. S instrukcemi AVX je kompatibilní, optimalizovaný
kód by však nejspíš měl běžet jen stejně rychle jako za
použití SSE, jelikož vektor je sice dvojnásobný, ale generuje
dva Micro Opy, jako dvě instrukce SSE. Zen tedy asi pomocí AVX či
AVX2 nezrychlíte, na druhou stranu to může kompenzovat
efektivnějším zpracováváním kódu v SSE, jenž je dnes
mnohem častějším úkazem. V tomto ohledu ukáží více
benchmarky jako enkodér x265.

Architektura AMD Zen (Hot Chips 28)
Architektura AMD Zen (Hot Chips 28)

Zatímco IPC by díky šířce jádra
a implementaci SMT navrch mohlo nabývat slušných hodnot, je
třeba dávat pozor na to, že tato charakteristika nedělá výkon
sama, absolutní „rychlost“ je vázána zároveň na frekvenci.
Právě frekvence by mohla být slabinou Zenu ve srovnání
s architekturami Intelu, které se během let vývoje vyšplhaly
na takty nad 4,0 GHz (alespoň u top modelů). To, jak je
zvýrazňována rovnováha v návrhu architektury, by mohlo
znamenat, že Zen bude mít potenciál k dosazžení vysoké
frekvence horší, právě výměnou za větší efektivitu, menší
komplexnost, či další faktory.

 

Inženýrské vzorky osmijader Summit
Ridge se údajně pohybují okolo 3,0 GHz a je možné, že
firma zvolila jako cílové optimum této architektury právě
hodnotu někde v této oblasti. To se může zdát jako hloupost
z pohledu desktopových procesorů a zejména, pokud jste
zvyklí přetaktovávat. Ovšem tato „chyba“ může být zároveň
výhodou pro oblast notebooků a serverů, kde se hraje na nižší
frekvence a ani Intel nějak závratných taktů nedosahuje.
Pokud by tedy Zen v tomto praktickém pásmu (dejme tomu 2,8–3,5
GHz) díky nižšímu „stropu“ získal výhodu větší
efektivity, šlo by patrně o dobrou volbu pro tyto dnes
nejdůležitější trhy. V desktopu by pak byl negativně
postižen jen výkon v jednom vlákně, vícevláknový by stále
byl kompenzován vyšším počtem jader proti konkurenčním
Intelům.

Nicméně frekvence, na kterých se Zen
bude reálně prodávat, jsou zatím stále neznámé, a s nimi
i absolutní výkon. V tomto ohledu si na lepší informace
asi ještě počkáme, neboť konkrétní parametry procesorů Summit
Ridge si AMD zatím nechává pro sebe a objeví se asi teprve,
až se přiblíží uvedení. To má dle AMD nastat z kraje roku
2017.

Architektura AMD Zen (Hot Chips 28)
Architektura AMD Zen (Hot Chips 28)

Zdroje: AMD

Architektura jádra Zen podrobně: hledání rovnováhy a přiblížení Intelu
Ohodnoťte tento článek!
5 (100%) 1 hlas/ů