Il est beaucoup plus difficile de développer des courses de données vraiment néfastes avec un seul processeur. Je veux dire, bien sûr, vous pouvez arracher des mots entre deux mots si vous interrompez un seul processeur, mais pouvez-vous créer des scénarios exotiques où il n’existe pas un seul entrelacement de fils qui fasse ce que vous voulez?
OK, faire des bugs insidieux ne compte pas comme une utilisation valide des avancées multi-codes. En fin de compte, il n’ya pas grand chose que plusieurs cœurs puissent faire, ce qui ne peut pas être donné par un seul cœur. La raison est simple. Si vous essayez d'éviter ces courses de données pervers, vous devez avoir des points de synchronisation dans votre code. Si vous modélisez votre code comme un réseau de calculs dans lequel certaines entrées doivent être complètes et synchronisées avant de pouvoir calculer et générer des sorties, il est facile de voir qu'un seul processeur peut simplement se frayer un chemin le long du réseau, en calculant le prochain bloc de travail disponible. .
En fait, si vous pouvez démontrer que votre algorithme peut être résolu par une machine de Turing (qui correspond à pratiquement tous les algorithmes qui nous intéressent), il peut être prouvé que l’algorithme peut être exécuté non seulement par un processeur central, mais machine d'état avec un très long morceau de ruban adhésif pour la mémoire!
Le détecteur de course CHESS exploite en fait cela pour trouver des cas de course. Il exécute tout ce qui est lu individuellement et explore systématiquement tous les intercalages possibles entre les threads, en essayant de trouver les cas où un test échoue à cause d'une affaire de race. CHESS dépend du fait que vous pouvez exécuter n’importe quelle application multithread sur un seul cœur.
Les cas dans lesquels vous avez besoin de multicœurs apparaissent lorsque vous commencez à étirer les limites du matériel. La plus évidente est lorsque vous avez des contraintes de temps. Certains problèmes de contraintes de temps en temps réel sont impossibles à résoudre avec un seul cœur, car ils ne peuvent tout simplement pas conduire assez rapidement l’horloge d’un seul cœur. Il y a une raison pour laquelle les processeurs ont grimpé jusqu'à 4 GHz puis se sont installés un peu, préférant plus de cœurs à des vitesses inférieures.
Une version plus exotique de cette contrainte de synchronisation se trouve dans les systèmes en temps réel. Dans certains systèmes en temps réel difficiles, le service des interruptions est si exigeant que vous devez choisir un processeur multicœur qui vous permet de répartir les interruptions sur les différents cœurs ou de rencontrer des contraintes de temps.
Une autre limite se pose avec les bus de données. Prenons le Blue Gene / P comme exemple. JUGENE, un superordinateur particulier Blue Gene / P, dispose de 144 téraoctets de mémoire. Ils ne fabriquent tout simplement pas d'ordinateurs à processeur unique pouvant accéder à toute cette mémoire.