Tak ja si napsal taky jednoduchy test (1h, neco pres 100 radku), testovano na zcela nahodnych datech (z urandom, jak pro data tak pro slovnik s 10M polozkami). #nocheat really.
Ze vstupnich 64-byte se pocita 32bit hash (xor, podminen nahodnymi daty v objektech) ktery je pak index do LUT pole (slovniku) o 4G polozkach, tim ze je tam obsazeno jen 10M zaznamu, tento vstupni filtr redukuje nutnost plneho porovnani cca 1:400. Ze neni match trva vzdy 1 nahodne cteni z pameti, kdyz je, je to o neco vice (kontrola celeho retezce, ze seznamu linkovaneho z LUT (zde se vyuzije cache, ze 64B se nacte jednou pametovou transakci), adresaci seznamu resim proprietarne at se me LUT vejde do mene nez 16G ram a vyzaduje se, aby hash distribuoval hodnoty rovnomerne).
Z 10M * 64B zajmovych polozek ve slovniku pri zhasovani na 32bit zatim taky nemam kolize - takze efektivita vylouceni bude narustem polozek casem klesat - nastesti to znamena zachovani max 1 polozky v seznamu pro plne overeni. Prumerne se dela tedy 399*1 nahodne + 1*3 souvisle pametove operace pro 400 testu.
Staci vysoke frekvence cpu (hash se spocte z L1, ma minimalni dopad na vykon) a hlavne rychle pameti s nizkou latenci - tohle reseni je vlastne limitovano pameti.
Bez specialni mmx/sse/avx onanie, bez prefetchu, jen primitivni C kod, jde zpracovani z prednacteneho pole z pameti takto:
X3430 4C/4T @ 2.40GHz (2ch DDR3-1333 ecc reg), zde kompilovano s gcc9.2 -O4:
# 4 * 26.4 = 105.6 MT/s
# 8 * 14.8 = 118.4 MT/s
Phi7250 68C/288T @ 1.4G (58c/58t pouzitelnych ze starsiho gentoo livecd), stejna binarka tudiz neoptimalni -march, bez DDR4, jen onchip 16G MCDRAM:
# 8 * 14.7 = 117.6 MT/s
# 16 * 15.1 = 241.6 MT/s
# 32 * 14.5 = 464.0 MT/s
# 64 * 12.5 = 800.0 MT/s
Vypusteni vypoctu hashe pridava na vykonu cca 50% - takze v pripade paralelizace cekani na lookup (pres prefetch) a vypoctu dalsiho hashe tohle opravdu lze ziskat.
Prinos rychle pameti je evidentni :-) Myslim ze dosazeni 2GT/s po optimalizacich a s jadrem co umi SMT2/SMT4 je na Phi i realny, ale 128GB/s dat - vstupniho streamu pro tuhle kadenci tam ale nikdy nedostanete. (36L pcie gen3 da cca 32GB/s, a dve 100G rozhrani (eth/OPI/IB) po x16 pak prinejlepsim 25GB/s dohromady).
K testovani 25Gb/s streamu (vase pripojeni) postaci cokoliv co zvladne overovani rychlosti 50MT/s.
pozn. 1T = 1 transakce (test) s 512bit daty.
Rekl bych zaverem.. uzke hrdlo bude jinde, nez v cache :-)