C'est fonction permettent de donnee un mask de thread physique ou un thread systeme peut s'executer. Pour une application haute performance, le systeme fait des choix d'execution assez con. migrer un thread d'un coeur a un autre ou d'un processeur a un autre est toujours catastrophique. Essayer d'executer n simple benchmark openmp avec ou sans affinite de thread, vous verrez certainement une difference de 15% de runtime. Regardez dans [1] l'importance de l'allocation des thread a des coeurs sur un probleme de coloration de graph. La majorite du papier concerne une execution sur machine a memoire distribue, mais la figure 4a concerne une execution sur une seule machine. On retrouve les meme effets sur a peu pres toutes les applications de calcul parallele (algo de graph, algebre lineaire dense et creuse, imagerie...)
Le systeme ne connait pas la logique applicative. Du fait, il n'est pas possible pour lui de scheduler des threads intelligement. Parcontre, si on fixe un thread par core, alors le developpeur peut allouer les taches de calcul intelligement. Deplus, il est important pour le scheduler de tache de l'applicatoin que les threads ne bougent pas, ca permet de tirer partie d'une allocation precedente et de s'assurer que les caches sont deja plein. Les donnees du scheduler de tache sont aussi toujours en cache, migrer un thread hors du niveau de cache qui va bien est alors une catastrophe. De facon sur, le scheduler d'openmp fonctionne comme ca. Les executions parallele base sur les techniques de workstealing ont besoin de thread fixer sur un core (cilk, kaapi, xkaapi, Intel cilk plus). Certains scheduler reutilisent des informations de scheduling passe pour faire leur decision future (affinity_scheduler de intel TBB).
Savoir ou sont les threads est egalement imperatif pour faire de l'allocation de memoire pour les machines qui ont des effets NUMA. Pour rappel, une machine a des effets NUMA quand certaine partie de la memoire, sont plus proche de certain coeur que d'autre. Par exemple, la plupart des machines multiprocesseurs sont comme ca. La plupart des noyaux ont une politiuqe d'allocation de la memoire dites first-touch, c'est a dire que la memoire physique est alloue sur le banc memoire le plus proche du coeur qui accede cette memoie (page) le premier. Si tu laisse le systeme faie ce qu'il veut, tu va te retrouver avec de la memoire distribue dans tous les banc memoire et les performances vont tomber. Sur la plupart des systeme que j'ai regarde, les access memoire sur un noeud numa different sont 3 fois plus lent (bandwidth et latency) que sur le noeud numa local.
[1] http://bmi.osu.edu/~esaule/public-website/paper/pco12-SSC.pdf