Vázaný na CPU

Afinita procesoru nebo afinita procesoru nebo afinita mezipaměti je  technologie, která zajišťuje, že proces nebo vlákno je připojeno a odpojeno ke konkrétnímu jádru CPU, CPU nebo sadě procesorů, takže proces nebo vlákno poběží pouze na zadaném jádru. , procesor nebo procesory, a nikoli na žádném procesoru ve víceprocesorovém systému. Afinitu procesoru lze považovat za modifikaci centrálního plánovacího algoritmu fronty úloh ve víceprocesorovém operačním systému. Každá položka ve frontě úkolů má přiřazenou značku, definující procesory, které s tím „souvisejí“.

Když jsou zdroje alokovány, každá úloha je přednostně distribuována pro provedení na jednom ze "příbuzných" procesorů. Afinita procesoru využívá skutečnosti, že data a nastavení procesu, který dříve běžel na daném procesoru, mohou být tomuto procesoru k dispozici rychleji než jinému. K tomu může dojít například v důsledku ukládání procesních dat do mezipaměti procesoru a také v některých dalších situacích. Naplánování běhu takového procesu na stejném procesoru zlepšuje jeho výkon omezením událostí snižujících výkon, jako jsou ztráty mezipaměti.

Navíc v některých systémech může mít každý z procesorů rychlejší přístup k oblasti paměti RAM, která je mu blízká. Zároveň se ukazuje jako racionální udržovat neustálou vazbu procesu na procesor, jehož přístup do RAM, kde jsou umístěna data tohoto procesu, je rychlejší.

Praktickým příkladem afinity procesoru je spuštění více instancí aplikace bez vláken, jako je například některý software pro vykreslování grafiky.

Implementace algoritmu plánování úloh, který poskytuje možnost vazby na procesor, je implementována s ohledem na vlastnosti konkrétních procesorů a konstrukci multiprocesorového systému, který bude takovým algoritmem řízen. Některé implementace za určitých okolností umožní přenesení úlohy na jiný procesor, čímž se překoná vazba. Děje se tak v těch případech, kdy z pohledu plánovače takovéto přepnutí povede ke zvýšení efektivity provádění úlohy. Například, když jsou dvě úlohy náročné na procesor (A a B) svázány se stejným procesorem a druhý procesor se nepoužívá, mnoho plánovačů přepne úlohu B na druhý procesor, aby co nejvíce zpřístupnil procesor systému. . Navázání úlohy B na nový procesor v takovém okamžiku nastaví plánovač sám.

Funkce implementace

Afinita procesoru může účinně snížit problémy se vstupem dat do systémové a/nebo procesorové mezipaměti. Neposkytuje však řešení problémů s vyrovnáváním zátěže [1] . Afinita CPU je složitější v systémech s heterogenní architekturou a vyžaduje sofistikovanější logiku plánovače než v plně homogenních systémech. Například systém se dvěma dvoujádrovými CPU , z nichž každý podporuje technologii Hyper-Threading , představuje problém pro algoritmus plánovače, který předpokládá afinitu CPU. Pokud má systém ještě větší počet procesorů a například sám o sobě není zcela symetrický, pak se složitost problému efektivního plánování úloh ještě zvyšuje.

Pro výše uvedený příklad se dvěma dvoujádrovými procesory s hypervláknem musí plánovač implementovat dvouúrovňový vazebný systém. Z hlediska efektivity mezipaměti je práce v rámci stejného jádra na různých vláknech ekvivalentní a plánovač má právo volně přesouvat úlohu z vlákna do vlákna. Úroveň "blízkosti" různých jader v rámci jednoho procesoru je nižší, protože částečně sdílejí společnou mezipaměť procesoru, úroveň "blízkosti" různých procesorů je ještě nižší. Protože jsou sdíleny i další prostředky, nelze jako základ pro plánování úloh použít samotnou afinitu CPU. Pokud například proces nedávno běžel na jednom virtuálním procesoru hyper-threading v nějakém jádru a tento virtuální procesor je aktuálně zaneprázdněn, ale druhý virtuální procesor stejného jádra je nečinný, afinita procesoru založená na účinnosti mezipaměti znamená, že proces musí být přenesen do druhého (neběžícího) virtuálního procesoru stejného jádra. Tyto dva virtuální procesory však soutěží o téměř všechny výpočetní prostředky, vyrovnávací paměť a paměťové prostředky. V této situaci by bylo zpravidla efektivnější přiřadit proces k jinému jádru nebo CPU, pokud jsou mezi nimi nečinné. To může mít za následek jednorázový zásah do výkonu kvůli skutečnosti, že přemístěný proces bude muset znovu doplnit mezipaměť svými daty. Celkový výkon však může být lepší, protože tyto dva procesy nemusí soupeřit o zdroje v rámci stejného CPU.

Aby bylo dosaženo maximální efektivity, musí plánovač úloh zohledňovat všechny tyto aspekty. Systémy s ještě většími úrovněmi asymetrie ( NUMA , shluky atd.) vyžadují od plánovače ještě větší složitost.

Implementace v konkrétních operačních systémech

V Linuxu lze afinitu procesoru zjistit nebo nastavit pomocí utility taskset [2] . Programově lze stejné akce provádět pomocí systémových volání sched_getaffinity a sched_setaffinity [3] . Afinitu vlákna lze nastavit nebo změnit pomocí jedné z funkcí knihovny: pthread_setaffinity_np [4] nebo pthread_attr_setaffinity_np [5] .

Na systémech SGI může být proces spojen se sadou procesorů pomocí nástroje dplace [6] .

V DragonFly BSD 1.9 (2007) a novějších lze k řízení afinity CPU použít systémové volání usched_set [7] [8] . V NetBSD 5.0, FreeBSD 7.2, DragonFly BSD 4.7 a novějších lze použít systémová volání pthread_setaffinity_np a pthread_getaffinity_np [9] . V NetBSD nastavuje obslužný program psrset [10] afinitu vlákna ke konkrétní sadě CPU. FreeBSD používá obslužný program cpuset [11] k vytvoření sad procesorů a přiřazení procesů k těmto sadám. V DragonFly BSD 3.1 (2012) a novějších lze použít utilitu usched k přiřazení procesů ke konkrétní sadě procesorů [12] .

V systému Windows NT a novějších lze afinity vláken a procesů nastavit samostatně pomocí volání API SetThreadAffinityMask [13] a SetProcessAffinityMask [14] nebo prostřednictvím rozhraní Správce úloh (pouze pro procesy).

macOS poskytuje rozhraní API pro vazby [15] , které poskytuje jádru operačního systému rady, jak naplánovat vlákna podle sad vazeb.

Na Solarisu můžete řídit vazbu procesů a lehkých procesů na procesor pomocí utility pbind [16] . K dispozici je také systémové volání processor_bind [17] . K dispozici jsou také volání rozhraní vyšší úrovně, jmenovitě pset_bind [18] nebo lgrp_affinity_get [19] , využívající koncepty procesorové sady a skupiny lokalit.

V systému AIX můžete spravovat vazby procesů pomocí obslužného programu bindprocessor [20] [21] a systémového volání bindprocessor [20 ] [ 22 ] .

z/OS implementuje možná nejsofistikovanější plánovač úloh, který se dnes používá . Poskytuje dynamicky se měnící přerozdělení hardwarových prostředků mezi procesy, včetně těch založených na vazbě procesů na jednotlivá procesorová jádra, procesory a jejich skupiny [23]

Podpora v programovacích jazycích

Standardní knihovna pro paralelní programovací jazyk Julia obsahuje experimentální podporu pro afinitu mezi procesy a procesory [24] .

Poznámky

  1. „White Paper – Processor Affinity“ Archivováno 8. června 2021 na Wayback Machine  – na tmurgent.com Archivováno 28. dubna 2020 na Wayback Machine .
  2. ↑ - Manuálnítaskset(1)  stránka pro vývojáře Linuxu - vlastní příkazy  
  3. ↑ - Manuálnísched_setaffinity(2)  stránka vývojáře Linuxu - systémová volání  
  4. ↑ - Manuálnípthread_setaffinity_np(3)  stránka vývojáře Linuxu - funkce knihovny  
  5. ↑ - Manuálnípthread_attr_setaffinity_np(3)  stránka vývojáře Linuxu - funkce knihovny  
  6. dplace.1 Archivováno 1. července 2007.  — Ze sgi.com Archivováno 27. března 2009 na Wayback Machine . Přístup 2007-07-06.
  7. usched_set(2)- nastavení proc se používá . DragonFly System Calls Manual . DragonFlyBSD . Staženo: 28. července 2019.
  8. . Křížový odkaz BSD . DragonFlyBSD . Staženo: 28. července 2019.kern/kern_usched.c § sys_usched_set
  9. pthread_setaffinity_np(3)  - Manuál funkcí knihovny NetBSD , FreeBSD a DragonFly BSD
  10. ↑ - Manuálnípsrset(8)  stránka správce systému NetBSD  
  11. cpuset(1)  - Manuálová stránka uživatelských příkazů FreeBSD  
  12. usched(8)- spusťte program se zadaným uživatelským plánovačem a cpumask . Manuál správce systému DragonFly . DragonFlyBSD . Staženo: 28. července 2019.
  13. SetThreadAffinityMask Archivováno 24. dubna 2008 na Wayback Machine  - MSDN Library
  14. SetProcessAffinityMask archivováno 25. března 2008 na Wayback Machine  - Knihovna MSDN
  15. Poznámky k verzi Thread Affinity API . developers.apple.com _ Získáno 27. května 2020. Archivováno z originálu dne 9. dubna 2012.
  16. pbind(1M) Archivováno 25. února 2021 na manuálové stránce Wayback Machine  – Solaris
  17. processor_bind(2) Archivováno 3. září 2016 na manuálové stránce Wayback Machine  - Solaris
  18. pset_bind(2) Archivováno 20. ledna 2022 na Wayback Machine  – Oracle Solaris 11.1 Information Library – manuálové stránky sekce 2
  19. lgrp_affinity_get(3LGRP) Archivováno 10. června 2016 na Wayback Machine  – příručka pro vývojáře optimalizace umístění paměti a vláken
  20. 1 2 Umesh Prabhakar Gaikwad; Kailas S. Zadbuke. Afinita procesoru na AIX (16. listopadu 2006). Získáno 27. května 2020. Archivováno z originálu dne 2. března 2020.
  21. příkaz bindprocessor . IBM . Získáno 27. května 2020. Archivováno z originálu dne 2. března 2020.
  22. bindprocessor Subrutina . IBM . Získáno 27. května 2020. Archivováno z originálu dne 2. března 2020.
  23. Technická příručka IBM zEnterprise 196. Bill White, Erik Bakker, Parwez Hamid, Octavian Lascu, Fernando Nogal, Frank Packeiser, Vicente Ranieri Jr., Karl-Erik Stenfors, Esra Ufacik, Chen Zhu, IBM Redbooks. října 2011
  24. Diskuse vývojářů