Hogyan használja ki az Apple új rendszer-a-chipen architektúráját?

A WWDC2020 egyik meglepőbb bejelentése az Intelről az Apple Siliconra való átállás volt. Ebben a cikkben azt szeretném megvizsgálni, hogy milyen hatással lesz ránk, szerény fejlesztőkre. Hogyan tudjuk majd kihasználni az új hardver előnyeit?

Ebben a „WWDC2020 videóban a témáról” az előadó (Gavin Barraclough) áttekint néhány különbséget az Intel-alapú és az Apple Silicon-alapú Mac-ek között, és bizonyos mértékben megválaszolja a kérdésemet. Vegyünk egy kicsit mélyebbre az ajánlásait.

Az egyik legfontosabb szempont az volt, hogy az Apple Silicon alapú új Mac-ek egyetlen rendszert fognak használni egy chipen vagy "SoC"-en. Maga az SoC egy aszimmetrikus többfeldolgozó egység, amely különbözik az Inteltől, amint az a bemutatóról készült képen látható:

A hangsúly az olyan hardver tervezésén van, amely képes lesz hatékonyabban futtatni a kevesebb CPU-t igénylő alkalmazásokat, miközben megtartja a nagyobb CPU-igényes alkalmazásokhoz szükséges teljesítményt. Az előadásban Gavin áttekinti, hogy milyen keretrendszerekre és formátumokra kell összpontosítania, hogy teljes mértékben kihasználhassa az új SoC előnyeit. Az ehhez hasonló keretrendszereket kifejezetten a többfeldolgozó magok kihasználására tervezték:

Nyilvánvalóan túl sok mindenről van itt szó, és ezt szem előtt tartva arra szeretnék összpontosítani, hogy mit tehet az alkalmazás manuális optimalizálása érdekében, hogy az aszimmetrikus, többfeldolgozós Apple SoC hardveren fusson – ez az optimalizálás, amiről azt gyanítom, hogy Ön már csinálja. csinál.

A Swift már egy ideje kihasználja ezt a fajta architektúrát a GCD vagy Grand Central Dispatch nevű rendszerrel.

Az AMP-hardver a GCD-vel a QoS használatára összpontosít. A Swiftben a QoS négy szintje van, amelyet az Apple definiált, itt a WWDC2015 dián a témában:

Alapértelmezés szerint a fő szál (User Interactive) mindig a legmagasabb prioritású. A róla küldött szálak a felhasználó által kezdeményezett módon futnak. Semmi sem fut segédprogramként vagy háttérként, hacsak nem adja meg. Tekintsük át, hogyan néz ki.

Hogy megbizonyosodjunk arról, hogy nem az almát és a narancsot hasonlítjuk össze, elolvasok egy 48 000 soros fájlt, és megjegyzem, mikor kezdem és mikor fejezem be.

Készítettem egy nagyon egyszerű animációt, amely megmutatja, mi történik. Az alábbi GIF szemlélteti a hatást. Amikor elindítom a bemutatóalkalmazást, mindkét feltöltésnél megjelenik a kezdési idő. Az adatok betöltésekor a felhasználói felület frissül a feltöltést futtató szálon háttérként. Mivel a feltöltés ugyanazon a szálon fut, mint a felhasználói felület, nem ad nekünk frissítést, amíg be nem fejeződik. A szál háttérbe tolásához a kód így néz ki:

DispatchQueue.global(qos: .background).async { 
  //background thread
}

Amint jól látható, bár a betöltés kevesebb időt vesz igénybe, a hatás nem túl felhasználóbarát. A felhasználó nem kap tájékoztatást a feltöltés folyamatáról, amíg az be nem fejeződik.

Hogyan fog ez működni az Apple Silicon esetében? Elméletileg jobban fog futni a háttérfeladaton (azaz kevesebb energiát használ, kevesebb hőt termel), ha a kód helyes prioritása van. Nem kell másképp kinéznie.

De várjon, egy kis figyelmeztetés a háttérben: Az üzenet, amelyet visszaküldök a felhasználói felületnek, ugyanazon a prioritáson fog futni, mint a szülő (más néven háttér), ami nem fog működni. Szerencsére az Xcode az alábbi üzenetek egyikével figyelmezteti Önt, ha elköveti ezt a hibát:

Ennek kijavításához egyszerűen be kell csomagolnia az UI kódot egy ilyen szálba:

DispatchQueue.main.async {
  // Update UI
}

Most már mindenki tudja, a kóder sikerének kulcsa a rendszerezés. Ehhez címkéket hozhat létre a sorok elnevezéséhez a következő kóddal:

let background = DispatchQueue.init(label: "background", qos: .background, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)
background.async {
  // do something
}

Az SoC laptopok legnagyobb előnyének megszerzésének titka az, hogy frissíti a kódot, és gondoskodik arról, hogy a szálak a megfelelő QoS-en futjanak.

Vissza az Apple Siliconhoz és azokhoz a magokhoz, amelyeket a szálak futtatásához fog használni. Van egy spekulatív számunk a 2020 negyedik negyedévi MBP-re (12 mag). Úgy tudjuk, négy mag a hatékonyságra, nyolc mag pedig a teljesítményre összpontosít. Ezeket a számokat szem előtt kell tartania a szálak létrehozásakor. Ezzel kapcsolatban azonban szeretném megemlíteni a frissített kódrészletet, amely "ebben a WWDC2015 videóban illusztrált":

Ezt használva a futó háttérfeladatok száma (tekintettel arra, hogy csak négy energiafókuszú magom van) soha nem haladja meg a négyet. Ez kulcsfontosságú, ha csak négy energiatakarékos magom van a hardveremben.

Természetesen idővel az alkalmazása sok különböző hardverplatformon futhat, és egy ideális világban ezt a kódrészletet intelligensebbé teheti, ha lekérdezi, hány magja van. Ezzel a kóddal megtudhatja, hogy az Ön által használt hardver mire képes:

let processInfo = ProcessInfo()
print(processInfo.activeProcessorCount)

Mielőtt befejezném, érintsünk meg egy WWDC2017-es prezentációt, amely egy másik módot vizsgál a kód gondosabb/hatékonyabb vezérlésére MP hardveren. Ez a kis részlet:

DispatchQueue.concurrentPerform(iterations: 16) { ( process ) in
  Thread.sleep(forTimeInterval: 1)
  print("process \(process)")
}

Ez annyi magon hajtja végre a folyamatot párhuzamosan, amennyit csak tud, és gyakorlatilag annyi folyamatot indít el, ahány mag a feladat végrehajtásához. Nyilvánvaló, hogy az adott feladatot gondosan fel kell osztani, hogy értelme legyen. Azt javaslom, hogy nézze meg a WWDC2017 beszélgetés a témáról első néhány percét, hogy jobban megértse, hogyan működhet ez Önnél is.

A DispatchQueue továbbra is előrehalad, és 2021-ben több primitív elemet tartalmazhat, amelyek segítenek az eddigi leghatékonyabb kódbázis felépítésében a különböző processzorosztályokon.

Visszatérve oda, ahonnan a WWDC2020 prezentációval kezdtem, Gavin még több szempontot érint, és valóban megnevez két további WWDC-ülést, amelyeket érdemes megnézni. A következő hetekben ezeket fogom megnézni. Maradjon velünk.

Ezzel a rövid cikk végére értem. Megtanultam néhány dolgot, amikor ezt írtam, és remélem, olvasás közben is.

Maradj nyugodt, folytasd a kódolást.