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.

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