Intel hybrid CPU: P-cores, E-cores

Az Intel Core 12. generáció óta tud olyat, hogy nem egyformák a magok. Van gyorsabb, meg lassabb.
Sajnos a könnyen elérhető leírások csak marketingek; azt magyarázzák meggyőzően, hogy ez nekem mennyire jó lesz.

A leginkább technikai az, hogy a P-cores (P=performance) az 2-szer akkora területet foglal el a chipben, mint az E-cores (E=Efficiency).

Mit mond Linux  6.1.0-37 (Debian-12) kernelem ezekről? Az első két core (0,1) tud HT-t (Hyperthreading) de ezt a funkciót kikapcsoltam.

CPU típusa: 13th Gen Intel(R) Core(TM) i7-1355U

Összesen 10 mag, HT bekapcsolásával 12-nek látszik.

magok gyors összehasonlítása
core Max Hz Base Hz Min Hz L1 d L1 i L2 L3
0 5.0 1.7 0.4 48kiB 32kiB 1280kiB 12MiB
1 5.0 1.7 0.4 48kiB 32kiB 1280kiB 12MiB
2-5 3.7 1.2 0.4 32kiB 64kiB 2048kiB 12MiB
6-9 3.7 1.2 0.4 32KiB 64kiB 2048kiB 12MiB

Memória-topológia:

memóra - 2 csatorna 
   \- L3 cache (12MiB) (megosztott)
      \- L2 cache (1280kiB)
      |   \- L1 i cache (32kiB) d cache (48kiB) - core0
      \- L2 cache (1280kiB)
      |   \- L1 i cache (32kiB) d cache (48kiB) - core1
      \- L2 cache (2048kiB)
      |   \- L1 i cache (64kiB) d cache (32kiB) - core2
      |   \- L1 i cache (64kiB) d cache (32kiB) - core3
      |   \- L1 i cache (64kiB) d cache (32kiB) - core4
      |   \- L1 i cache (64kiB) d cache (32kiB) - core5
      \- L2 cache (2048kiB)
          \- L1 i cache (64kiB) d cache (32kiB) - core6
          \- L1 i cache (64kiB) d cache (32kiB) - core7
          \- L1 i cache (64kiB) d cache (32kiB) - core8
          \- L1 i cache (64kiB) d cache (32kiB) - core9

Látható, hogy az L2 cache megosztott az E-cores esetében, de dedikált a P-cores esetében.

Gyártási topológia: Egy tokozásban egy chip. A chipben 4 clusterbe vannak rendezve a magok, ez megfelel a fenti táblázat 4 sorának. Ezen kívül a memóriavezérlő, jónéhány periféria és egy grafikus processzor is van a chipben.

Ezek (frekvencia és cache size) még önmagában nem indokolná a jelentős méret-, és teljesítméménykülönbséget. A leírások mindenféle belső utasitás-feldolgozókról, párhuzamosságokról szolnak. Meg arról, hogy az E-core valójában egy 6th Gen Intel Core új gyártástechnilógiával.

De mit tud az egész valójában? Van nekem egy flops számoló programom, (fejlesztés alatt) ami elég jól boldogul a több egyforma maggal, de nem tudja jól használni a különböző teljesítményű magokat. Sebaj, az egyedi magok teljesítményét össze tudom vele hasonlítani. Maradjatok velem, 1-2 nap alatt lemérem ezeket.

Hozzászólások

for i in  /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor ; do echo performance > $i ; done
cd /sys/fs/cgroup
echo "+cpuset" >  cgroup.subtree_control
mkdir perftest
echo 174701 > perftest/cgroup.procs # ez a teszt shell pidje
echo 1 > perftest/cpuset.cpus # aztán echo 0-1, aztán echo 2-3 stb

És ezek után futtatom a programom.

feltétel FP32 Gflops FP64 Gflops
1 P-core 23.6 9.3
2 P-core 43.5 17.8
1 E-core 9.7 4.4
2 E-core 19.4 8.6
4 E-core 35.6 16.0
8 E-core 57.2 20.5

Megjegyzem, hogy a mérőprogramom egy szimpla többszálú lebegőpontos szorzás (mátrixszozrás), ami nagyon szépen tudja használni a E-core közös L2 cache-ét. (Merthogy közös az adat). Várhatóan lassabb lenne, ha más adaton számolna a másik szál. Mindenesetre látható, hogy az E-core tényleg sokkal lassabb, azonban nagy száma miatt egy jól párhuzamosítható algoritmust érdemesebb azokon futtatni.
 

Most gondolkodhatok, hogyan lehetne valami automatizmussal az algoritmust jól teríteni ezekre a különböző magokra.

Ez ugye, egy notebook cpu. Hogy lássunk valami nagyon mást is, ugyan ez a program, AMD Ryzen 7 9800x3d -on:

FP32: 454.8 Gflops

FP64: 199.7 Gflops

Most nincs Ryzen 7 9800x3d, van helyette Ryzen 5 9600X (ez ugye, egy jóval gyengébb, 6 core+HT = 12vcore)

Ryzen 5 9600X
vCores FP32 Gflops FP64 Gflops
12 271 114
8 243 110
4 128 63
2 104 52
1 52 27

Azon csodálkoztam is, hogy a HT ennyit számít (2vCores = 1 Core). Ez a jelenséget Ryzen 7 9800x3d esetén is tapasztaltam (mármint, hogy a HT az jó).
A méres tulajdonsága, hogy erősen memória-sávszélesség intenzív. A memóriabusz hamar szaturál, és utána kevéssé nő a teljesítmény a magok számával.

Igen. Ez mátrixszorzás. Két óriási tömböt kell beolvasni, és bizonyos szabályok szerint szorozni-összeadni. Nagyon macerás cache-optimális algoritmust készíteni, emiat, igen, a nagy méretű cache ebben a feladatban létfontosságú. Egy másik tesztet is végeztem ezekkel a procikkal: python 3.12 build&install. Az szigorúan specint jelleű feladat, és különböző szálak különböző adaton dolgoznak.. Hiába nvme diszkek meg nagy belső memória, az a Ryzen7 7800x3d | Ryzen7 9800x3d brutálisan gyors volt. Sajnos nem mértem időt, de azt hittem, elesett. Pedig lefutott. Ehhez képest a Ryzen 5 9600X az 1:07 min:sec, ami nagyon szép érték de nem hihetetlen.

Ugy emlekszem, ha a jobb matrixot elso lepesben transzponalod, sokkal gyorsabb lesz, mert a cache-bol sorfolytonosan olvasod a szamokat. Szoktak ilyesmivel trukkozni matrixos libek. Volt errol youtube-on egy video, valaki pont egy matrixszorzast optimalizalt - amennyire tudott. Az utolso valtozatban mondjuk pont a transzponalos lepest kihagyta, mert mar nem a cache-en akadt meg az algoritmusa.

A strange game. The only winning move is not to play. How about a nice game of chess?

Transpose: igen, úgy is van. Meg opencl esetében van vectordot utasás, ha lehetőség van, használva. Meg igazítás mindenféle byte-méretre. Sikerült felülmúlnom a 40 éve reszelgetet blas::dot() sebességét, akkor hagytam abba az optimalizációt. Az volt a progival az elsődleges célom, hogy CPU-GPU ár/teljesítmény összehasonlításhoz kapjak méréseket.

Azt is mondjuk ki, hogy a numpy.matmul nagyságrendekkel gyorsabb. (Gondolom gyorsabb alguritmust használ eleve.) Ha valóban mátrixot kellene szoroznom, akkor np/jax; de nem mátrixot szorzok, hanem CPU-t mérek.

Ez a notebook cpu tartalmaz intel GPU-t. Ez meghajtható számolási célra OpenCL segítséggel. Sajnálatosan nincs benne fp64 támogatás (csak fp16, fp32 meg int)

hogyan FP32 Gflops FP64 Gflops
GPU 101.5  
CPU HT off 67.5 24.4
CPU HT on 81.4 29
  • Hehe, ebben a chipben erősebb GPU van (FP32 szempontjából) mint az összes core egyszerre.
  • A P-core gyorsabb, mint az E-core, emiatt a mérési program egyenletes terítése nem optimális. (A P-core hamarabb végez a feladattal, és utána vár)
  • Viszont a P-core a korábbi mérések alapján cca 2-szer gyorsabb, mint az E-core, így a P-core feldarabolása kétfelé (HT) nagyjából egyenlő erejű vCore-kat eredményez, így a programom teritése cca optimális. Jobb is lett az eredmény.
  • Az buli lenne, ha egyszerre tudnám meghajtani a GPU és a CPU részt, összeadva a teljesítményüket. Várhatóan a notebook gyengécske hűtése lenne a limitáló tényező; vagy egyenesen a tápegység (ez a CPU 55W-ot tud enni, a tápegység egy szokásos USB-c 65W)

Itt jártam.

Vortex Rikers NC114-85EKLS

Szerkesztve: 2025. 06. 27., p – 13:06

Nem kétszer, csak duplázott :)

Vortex Rikers NC114-85EKLS

Szerkesztve: 2025. 06. 28., szo – 11:05

És az mennyit számít(hat) hogy az E core-ok instruction cache-e 2x akkora? 

Ez engem érdekel! :)

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Másik mérés: Python interpreter fordítása.

fordítási idők (sec), kissebb jobb
Aktív magok WallClock CpuTime rate
2P+HT+8E=12vCPU 117.512 659.801 5.6
2P+HT 195.570 578.035 2.9
8E 156.402 600.322 3.8
2P+noht+8E 132.248 719.960 5.4
2P+noht 209.470 342.747 1.6
4E (két L2) 205.186 535.075 2.6
4E (közös L2) 211.960 560.198 2.6

 

Összefoglaló:

  • Megéri a HT-t bekapcsolni (+20%)
  • itt is 4 darab E-core hasonló eredményt adott, mint 2 darab P-core
  • gyorsan felszaladt a hőmérséklet 80 C⁰ fölé, felzúgott a venti, levette a CPU frekvenciát

 

Megjegyzések:

  • Python 3.12.11 fordítása make -j $NUM
  • gcc 12.2.0
  • Minden python module-hoz megvan minden, tehat full make
  • A feladat érdekessége, hogy van benne egy hosszas 1 szálú tesztelés, nem tiszta párhuzamos
  • Clean reboot, no browser, no mailer.
  • A legelső mért futtatás elött egy "cache-warmup" futtatás.
  • Minden futtatás után megvárjuk, amíg a CPU  lehül 50 fokra (leáll a FAN)
  • Minden futtatás elöt make clean;
  • A notebook töltőn volt végig
  • performance  intel_pstate mód
  • CPU mag limitációk cgroup+cpuset módon
  • HT on/HT off beállítás BIOS-ból
  • 16Gbyte DDR4-3200 1 darab So-dimm
  • Western Digital PC SN740 NVMe SSD, ext4
  • ez egy notebook

Összefoglaló

Nem látom értelmét notebook környezetben ennek a P core + E core hybrid CPU koncepciónak. Mielött még érdekes dolgok történtek volna, az egész szórakozást lelimitálta notebook-ban szokásos hűtés gyengesége.

Ha munkaállomás/szerver környezetben képzelem el az egészet, amikor is a hűtés tisztességes és nem gátol, akkor sem látom be, hogy mi értelme volna kétszer annyi darab, de fele olyan drága és fele olyan gyors maggal bővíteni a rendszert. (Ugyanis a leírások szerint 2P+8E cca ugyanannyiba kerül legyártani, mint 6P magot, és nagyjából ugyanannyira is gyors).

Esetleg egy nagyon belépő szintű egygépes virtualizált környezetben, ahol is LAMP szogáltatáshoz a P magokat megkapja a DB, az E magokat megkapja az apache, akkor talán van anyagi előnye.

Amennyiben feltételezzük, hogy a programok vacakul vannak megírva, és az oprendszer ütemezője vacak, akkor ez a hybrid felállás javíthat az interakív reagáláson (latency). Lehet, hogy javít, nem biztos, nem mértem, ötletem sincs, hogyan lehetne objektíven mérni..