Dans un processeur multicœur, il existe des moyens de dire à l'application particulière de fonctionner en monocœur ou en 2 cœurs ou 3 cœurs. Considérant un scénario dans lequel l'application (ayant des threads de lot) s'exécute sur plus d'un cœur, comment un planificateur sera-t-il capable de déterminer la charge (nombre de threads) sur un coeur particulier dans un processeur multicœur et de distribuer (équilibrer) le charger (allouer des threads) à travers les différents cœurs?Détermination de la charge sur un cœur particulier dans un processeur multicœur
Répondre
Dans la plupart des planificateurs, chaque CPU est une entité indépendante qui examine l'état actuel du système et essaie de trouver quelque chose d'utile à faire. Imaginez le CPU comme un bourreau de travail - il essayera toujours de tout ce qui peut être fait. Un ordonnanceur n'est pas un "patron" qui indique aux CPU ce qu'il faut faire ensuite, en s'assurant que tout le monde fasse une bonne part. Chaque processeur suit plutôt un algorithme d'ordonnancement dans lequel il examinera l'état du système et tentera de déterminer comment faire le plus de travail possible. L'algorithme d'ordonnancement peut prévoir une certaine "affinité de thread", ce qui signifie qu'un CPU préférera exécuter un thread précédemment planifié, car ce thread est plus susceptible d'être en cache. Tout à fait à la différence de l'équilibrage de la charge réseau, les algorithmes d'ordonnancement sont généralement (mais pas toujours) concernés par le fait de garder chaque processeur occupé autant que possible, même si la charge de travail s'avère injuste.
Pourquoi? Si la charge de travail est gourmande en ressources processeur, chaque processeur pourra fonctionner à près de 100% et la charge de travail sera équitable. Si la charge de travail est intensive en E/S et que les processeurs passent le plus clair de leur temps à attendre que les ressources partagées soient disponibles, ce qui est le cas normal pour un système réel, toute stratégie d'équilibrage de charge est probablement incompatible avec les ressources partagées. Aussi vite que possible. Un planificateur multi-CPU simple inclurait une file d'attente de threads exécutables et une liste de threads bloqués - cette file d'attente et cette liste étant des structures de données partagées par toutes les CPU, avec des accès protégés par le verrouillage. Quand une CPU entre dans le planificateur, elle sélectionne le thread exécutable de la plus haute priorité et exécute ce thread jusqu'à ce que les blocs ou le timeslice alloué expire. Si le thread bloque, il est placé dans la liste des threads bloqués jusqu'à ce qu'il redevienne exécutable. Si le délai d'expiration expire, le thread est placé dans une position différée dans la file d'attente de thread exécutable et un autre thread est sélectionné.
Sous Linux, vous pouvez utiliser taskset -C### ./executable
où une liste est #### cpu
ordonnanceurs qui sont au courant multicoeur est un sujet distinct itself.You pourrait vouloir regarder ceci: http: //software.intel. com/sites/oss/pdfs/mclinux.pdf Au niveau du programmeur, vous devez développer vos algorithmes de telle sorte que les parties qui ne sont pas mutuellement dépendantes puissent être exécutées en parallèle (threads). Les transformées de Fourier rapides sont un parfait exemple de calcul en parallèle .Il existe des bibliothèques parallèles qui facilitent la programmation multicœur. – itisravi
Bien que je n'ai pas eu la réponse exacte, c'était un très bon lien. –