AVG CPU CLOCKS FOR DEPENDENT INDEPENDENT rdtsc 66.772 64.011 32bit add 1.004 0.341 32*32->64bit imul 4.795 1.520 0*0 imul 4.796 64/32->32.32 div 41.016 64bit fadd 2.252 1.030 64bit NaN+x fadd 193.185 214.474 64bit fmul 5.000 2.030 64bit fdiv 37.471 37.005 32bit load from L1-cache 1.073 pitch=4B Segmentation faultTedy prakticky totožné s tím Xeonem v článku (až do segfaultu).
model name : Intel(R) Core(TM)2 Duo CPU T7500 @ 2.20GHz cpu MHz : 2201.000 cache size : 4096 KB model name : Intel(R) Core(TM)2 Duo CPU T7500 @ 2.20GHz cpu MHz : 2201.000 cache size : 4096 KB AVG CPU CLOCKS FOR DEPENDENT INDEPENDENT rdtsc 59.592 58.676 32bit add 0.920 0.314 32*32->64bit imul 4.375 1.401 0*0 imul 4.397 64/32->32.32 div 37.916 64bit fadd 2.064 0.943 64bit NaN+x fadd 178.103 196.701 64bit fmul 4.583 1.860 64bit fdiv 34.349 33.919 32bit load from L1-cache 0.917 pitch=4B typical L1-miss load 56.843 pitch=74B load from RAM 151.16ns 332.709 pitch=1048572B load from RAM 12.64ns 27.825 pitch=1048572B (1-pass cache flush)
model name : Intel(R) Xeon(R) CPU L5430 @ 2.66GHz cpu MHz : 2666.673 cache size : 6144 KB cache_alignment : 64 model name : Intel(R) Xeon(R) CPU L5430 @ 2.66GHz cpu MHz : 2666.673 cache size : 6144 KB cache_alignment : 64 model name : Intel(R) Xeon(R) CPU L5430 @ 2.66GHz cpu MHz : 2666.673 cache size : 6144 KB cache_alignment : 64 model name : Intel(R) Xeon(R) CPU L5430 @ 2.66GHz cpu MHz : 2666.673 cache size : 6144 KB cache_alignment : 64 model name : Intel(R) Xeon(R) CPU L5430 @ 2.66GHz cpu MHz : 2666.673 cache size : 6144 KB cache_alignment : 64 model name : Intel(R) Xeon(R) CPU L5430 @ 2.66GHz cpu MHz : 2666.673 cache size : 6144 KB cache_alignment : 64 model name : Intel(R) Xeon(R) CPU L5430 @ 2.66GHz cpu MHz : 2666.673 cache size : 6144 KB cache_alignment : 64 model name : Intel(R) Xeon(R) CPU L5430 @ 2.66GHz cpu MHz : 2666.673 cache size : 6144 KB cache_alignment : 64 AVG CPU CLOCKS FOR DEPENDENT INDEPENDENT rdtsc 42.681 42.681 32bit add 1.338 0.454 32*32->64bit imul 6.346 2.027 0*0 imul 6.373 64/32->32.32 div 23.595 64bit fadd 2.251 1.035 64bit NaN+x fadd 194.284 214.585 64bit fmul 5.000 2.028 64bit fdiv 22.471 22.001 32bit load from L1-cache 0.995 pitch=4B typical L1-miss load 62.231 pitch=74B load from RAM 150.62ns 401.661 pitch=1048572B load from RAM 11.02ns 29.378 pitch=1048572B (1-pass cache flush)
POCITAC FIREBALL1 (4jadro) model name : Intel(R) Xeon(R) CPU 5160 @ 3.00GHz cpu MHz : 2992.494 cache size : 4096 KB cache_alignment : 64 mazaci blok velikosti 150MB: AVG CPU CLOCKS FOR DEPENDENT INDEPENDENT 32bit load from L1-cache 1.001 pitch=4B typical L1-miss load 64.689 pitch=74B load from RAM 142.65ns 426.877 pitch=1048572B load from RAM 9.65ns 28.889 pitch=1048572B (1-pass cache flush) mazaci blok velikosti 1GB: 32bit load from L1-cache 1.001 pitch=4B typical L1-miss load 64.366 pitch=74B load from RAM 142.02ns 424.983 pitch=1048572B load from RAM 58.34ns 174.595 pitch=1048572B (1-pass cache flush) mazaci blok velikosti 2GB: 32bit load from L1-cache 1.001 pitch=4B typical L1-miss load 64.672 pitch=74B load from RAM 142.19ns 425.489 pitch=1048572B load from RAM 98.33ns 294.239 pitch=1048572B (1-pass cache flush)
Tenhle nápad s testováním CPU není až tak špatný, ale neodpustím si několik poznámek:
Jinak též všem zainteresovaným vřele doporučuji přečíst si tuhle analýzu od Ulricha Dreppera:
What Every Programmer Should Know About Memory
Asi jsem blbej, ale nejak vas prispevek uplne nechapu. Myslel jsem ze kdyz to udelam tak, ze nejprve nejak vyprazdnim cache a pak budu cist s takovou pitch aby mi preread nemohl moc pomahat (tim ze by dostal data do L2 cache driv nez si o ne program rekne) tak dostanu (kdyz se zanedba TLB-miss) zhruba dobu latence pameti krat pocet prectenych cisel. A to by nemelo na cachich zaviset vubec, protoze stejnou adresu (ani z jejiho okoli) uz podruhy nectu. Kdyz to pak 20* opakuju tak to opakuju i s tim vyprazdnovanim (proto to tak dlouho trva). Jeste takova technicka drobnost: data z toho 512MB pole se musi na zacatku aspon na kazdem 4tem KB precist/zapsat aby se prislusna stranka v linuxu vubec namapovala a nezdrzovalo to az pri testovani. Pri kazdem opakovani se zminena pole alokuji a znovu uvolnuji.
Takze problem je hlavne v tom, jak delat vyprazdnovani cache, abych z ni data temer urcite dostal pryc. Zjistil jsem, ze jen zapsat 150MB (s pitch=4) a zase je precist na nekterych CPU nestaci.
Kdyby bylo vypnute strankovani tak zapsanim a opetovnym prectenim 150MB (s pitch=4) je cache vyprazdnena urcite. Se zapnutym strankovanim je to slozitejsi, protoze mi alokace pameti muze vratit stranky jejihz fyzicke adresy se mapuji na stejne misto v cache. V extremnim pripade by se mohlo stat, ze diky takovemuto sdileni zustane jine misto cache zcela netknute a jako na potvoru v nem preziji data co pak budu cist (kterych jak jste spravne podotkl je pomerne malo).
Obecne je toto problem i operacniho systemu, protoze kdyz se to stane, tak se tim zhorsi vyuziti cache. Proto se tomu nektere UNIXy se snazi zabranit tzv. barvenim stranek, kdy se snazi alokovat stranky ktere v cache pak nekoliduji. Jenze pokud si vzpominam, tak ma Linux pouze barveni objektu uvnitr slabu. Takze se po nejake dobe da ocekavat, ze fyzicke stranky budou pridelovany vicemene nahodne. Rekneme ze je to nas pripad a zeptejme se jaka je pravdepodobnost, ze se celou cache nepodari vyprazdnit, tj. ze existuje aspon 1 adresa stanky uvnitr cache ktera nebude zasazena.
Nejdriv obarvim stranky pameti tak ze 2 dostanou stejnou barvu pokud se mapuji na stejnou adresu v cache. Barev je C=velikost_cache/velikost_stranky coz v pripade 4KB stranky a 4MB L2-cache je C=1024. Pak me zajima horni odhad na pravdepodobnost ze ani po K=150MB/4KB=150*256 nahodnych vyberech (bez vraceni) stranky nezasahnu barvu 1.
Pri prvnim vyberu je to zjevne (1-1/C). V dalsim vyberu je o neco mene nez (1-1/C) protoze uz jsem jednu non-1 barvu pouzil. Me ale jde jen o horni odhad takze budu brat (1-1/C). Z toho mam pravdepodobnost (1-1/C)^K ze minu barvu 1 (ostatni barvy muzu nebo nemusim minout).
Nakonec mi jde o to jaka je pravdepodobnost ze minu NEJAKOU barvu. To se da zhora odhadnout jako C*(1-1/C)^K. Neformalne receno je to diky tomu ze bud minu barvu 1, nebo 2, nebo... C. Horni odhad je to proto, ze nejde o disjunktni jevy (vzorec (1-1/C)^K pouzity pro barvu 1 v sobe ma i prispevek jevu ze minu barvu 1 i 2 a neminu ostatni, stejne tak jako vzorec (1-1/C)^K pouzity pro barvu 2 --- tim tam napr. tyto jevy zapocitam vickrat).
Po dosazeni
gnuplot> C=1024.0 gnuplot> print C*(1-1.0/C)**(150*1024/4) 5.20354763762773e-14
Takze pravdepodobnost, ze se nepodari vyprazdnit cache je temer zanedbatelna.
Pekne je videt v praxi, ze moc nezalezi na velikosti toho vyprazdovaciho pole. At je to 150MB nebo 2GB tak jsou vysledky pri dukladnem vyprazdnovani stejne. Vysledky pri 1pass-flush se lisi, ale to myslim je nejaky dalsi efekt.
model name : Intel(R) Xeon(R) CPU 5160 @ 3.00GHz cpu MHz : 2992.494 cache size : 4096 KB cache_alignment : 64 AVG CPU CLOCKS FOR DEPENDENT INDEPENDENT pro mazaci blok velikosti 150MB: 32bit load from L1-cache 1.001 pitch=4B typical L1-miss load 64.689 pitch=74B load from RAM 142.65ns 426.877 pitch=1048572B load from RAM 9.65ns 28.889 pitch=1048572B (1-pass cache flush) pro mazaci blok velikosti 1GB: 32bit load from L1-cache 1.001 pitch=4B typical L1-miss load 64.366 pitch=74B load from RAM 142.02ns 424.983 pitch=1048572B load from RAM 58.34ns 174.595 pitch=1048572B (1-pass cache flush) pro mazaci blok velikosti 2GB: 32bit load from L1-cache 1.001 pitch=4B typical L1-miss load 64.672 pitch=74B load from RAM 142.19ns 425.489 pitch=1048572B load from RAM 98.33ns 294.239 pitch=1048572B (1-pass cache flush)
"Nikoli. Barev je velikost cache/asociativita_cache/velikost_stranky"
To ano, ale intuitivne ocekavam ze ta pravdepodobnost moc nezmeni. I kdyby to bylo 1000* horsi tak to porad bude zanedbatelne.
"--- takže se pak stane, že ani lineární přístup to nevyprázdní, pokud cache vyhazuje stránky s nejmenším počítadlem přístupu."
ano je spravna pripominka. Takze jsem to prelozil bez toho for(rep...) a vysledek pro pocitac fireball je zde. Temer nelisi od puvodni verze. chce vymyslet duvod proc 1-pass flush nevyprazdni local-multi-pass ano (a jeste jenom na intelech)
model name : Intel(R) Xeon(R) CPU 5160 @ 3.00GHz cpu MHz : 2992.494 cache size : 4096 KB cache_alignment : 64 AVG CPU CLOCKS FOR DEPENDENT INDEPENDENT rdtsc 65.011 64.011 32bit add 1.003 0.343 32*32->64bit imul 4.771 1.528 0*0 imul 4.769 64/32->32.32 div 41.051 64bit fadd 2.252 1.031 64bit NaN+x fadd 195.300 214.651 64bit fmul 5.000 2.031 64bit fdiv 37.471 37.002 32bit load from L1-cache 1.001 pitch=4B typical L1-miss load 64.667 pitch=74B load from RAM 140.63ns 420.839 pitch=1048572B load from RAM 10.07ns 30.127 pitch=1048572B (1-pass cache flush)
Kdyby se to ridilo jen pomoci LRU citacu, tak by pak 3* opakovany one-pass flush mel zvitezit nad 1* opakovanym zapisem a ctenim dat. Jenze se to nestane:
model name : Intel(R) Xeon(R) CPU 5160 @ 3.00GHz cpu MHz : 2992.494 cache size : 4096 KB cache_alignment : 64 AVG CPU CLOCKS FOR DEPENDENT INDEPENDENT rdtsc 65.011 64.011 32bit add 1.003 0.343 32*32->64bit imul 4.768 1.528 0*0 imul 4.769 64/32->32.32 div 41.056 64bit fadd 2.252 1.031 64bit NaN+x fadd 195.300 214.584 64bit fmul 5.000 2.031 64bit fdiv 37.471 37.002 32bit load from L1-cache 1.001 pitch=4B typical L1-miss load 64.604 pitch=74B load from RAM 141.97ns 424.833 pitch=1048572B load from RAM 11.21ns 33.558 pitch=1048572B
Dokonce i kdyz jsem opakovani udelal uvnitr smycky, tj. ze jsem cetl 10* po sobe totez misto z pameti (ovsem nevim jestli se to bude zapocitavat do counteru L2 cache kdyz to jde tak rychle po sobe), tak se vysledek posledni radky testu moc nezmenil --- vychazelo 14.22 ns.
Takze bud se ty countery v L2 cache updatuji nejak pomaleji, nebo je tam jeste jiny mechanismus. V te posledni verzi mohla mit data co chci vyprazdnit counter maximalne 2, oproti datum kterymi to vyprazdnuju, ktere ho mely maximalne 10. Musi tam byt jeste jiny mechanismus (treba nejaky pomaly update counteru, nebo kdovico jinyho) ktery by to vysvetlil.
~> gcc malfunction.cc /tmp/ccohDlGj.o:(.eh_frame+0x13): undefined reference to `__gxx_personality_v0' collect2: ld returned 1 exit status ~> gcc --version gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-27) Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
netbook AMILO Ui3520 (fujitsu-siemens) model name : Intel(R) Atom(TM) CPU N270 @ 1.60GHz cpu MHz : 1600.970 cache size : 32 KB AVG CPU CLOCKS FOR DEPENDENT INDEPENDENT rdtsc 30.021 29.021 32bit add 1.000 0.508 32*32->64bit imul 6.082 9.143 0*0 imul 6.082 64/32->32.32 div 49.748 64bit fadd 5.110 2.055 64bit NaN+x fadd 393.982 415.798 64bit fmul 5.000 2.058 64bit fdiv 72.115 71.006 32bit load from L1-cache 2.504 pitch=4B typical L1-miss load 34.159 pitch=74B load from RAM 245.08ns 392.362 pitch=1048572B load from RAM 217.02ns 347.437 pitch=1048572B (1-pass cache flush) OLD VERSION READ-TEST: 32bit load from L1-cache 2.004 pitch=4B typical L1-miss load 17.336 pitch=74B load from RAM 126.31ns 202.212 pitch=1048572B load from RAM 104.41ns 167.162 pitch=1048572B (1-pass cache flush)ten test potrebuje zhruba 700MB volne ramky.
model name : AMD Phenom(tm) 9750 Quad-Core Processor cpu MHz : 1200.000 cache size : 512 KB cache_alignment : 64 model name : AMD Phenom(tm) 9750 Quad-Core Processor cpu MHz : 1200.000 cache size : 512 KB cache_alignment : 64 model name : AMD Phenom(tm) 9750 Quad-Core Processor cpu MHz : 1200.000 cache size : 512 KB cache_alignment : 64 model name : AMD Phenom(tm) 9750 Quad-Core Processor cpu MHz : 1200.000 cache size : 512 KB cache_alignment : 64 AVG CPU CLOCKS FOR DEPENDENT INDEPENDENT rdtsc 70.117 69.423 32bit add 0.999 0.336 32*32->64bit imul 3.000 1.044 0*0 imul 3.000 64/32->32.32 div 47.025 64bit fadd 2.981 0.998 64bit NaN+x fadd 4.039 0.999 64bit fmul 3.999 0.998 64bit fdiv 22.473 20.996 32bit load from L1-cache 0.558 pitch=4B typical L1-miss load 28.557 pitch=74B load from RAM 207.36ns 248.828 pitch=1048572B load from RAM 219.43ns 263.318 pitch=1048572B (1-pass cache flush)jenom k té první hodnotě rdtsc: Toto je nejnižší hodnota, které se mi podařilo dosáhnout jen jednou, jinak tam lítá:
model name : AMD Phenom(tm) 9750 Quad-Core Processor cpu MHz : 1200.000 cache size : 512 KB cache_alignment : 64 model name : AMD Phenom(tm) 9750 Quad-Core Processor cpu MHz : 1200.000 cache size : 512 KB cache_alignment : 64 model name : AMD Phenom(tm) 9750 Quad-Core Processor cpu MHz : 1200.000 cache size : 512 KB cache_alignment : 64 model name : AMD Phenom(tm) 9750 Quad-Core Processor cpu MHz : 1200.000 cache size : 512 KB cache_alignment : 64 AVG CPU CLOCKS FOR DEPENDENT INDEPENDENT rdtsc 116.031 116.016 32bit add 1.999 0.672 32*32->64bit imul 3.000 2.089 0*0 imul 3.000 64/32->32.32 div 47.019 64bit fadd 2.980 0.992 64bit NaN+x fadd 4.038 0.993 64bit fmul 3.998 0.992 64bit fdiv 22.472 20.991 32bit load from L1-cache 0.547 pitch=4B typical L1-miss load 28.549 pitch=74B load from RAM 203.72ns 244.469 pitch=1048572B load from RAM 217.87ns 261.446 pitch=1048572B (1-pass cache flush)Nijak jsem neořezával procesy... Mám spuštěnej desktop s běžnými programy, je možné, že to někde něco brzdí.
model name : AMD-K6(tm) 3D processor cpu MHz : 300.745 cache size : 64 KB AVG CPU CLOCKS FOR DEPENDENT INDEPENDENT rdtsc 9.011 7.681 32bit add 1.000 0.556 32*32->64bit imul 3.043 3.177 0*0 imul 3.043 64/32->32.32 div 20.292 64bit fadd 3.050 3.006 64bit NaN+x fadd 7.126 7.008 64bit fmul 3.000 3.006 64bit fdiv 40.632 41.432 32bit load from L1-cache 1.061 pitch=4B typical L1-miss load 95.363 pitch=74B load from RAM 688.83ns 207.162 pitch=1048572B load from RAM 223.15ns 67.112 pitch=1048572B (1-pass cache flush) OLD VERSION READ-TEST: 32bit load from L1-cache 2.283 pitch=4B typical L1-miss load 47.693 pitch=74B load from RAM 360.69ns 108.475 pitch=1048572B load from RAM 111.43ns 33.512 pitch=1048572B (1-pass cache flush)