Les architectures de CPU sont-elles orientées vers les temps d'exécution procéduraux?

13

Y a-t-il des modifications qui pourraient être apportées aux processeurs pour les rendre plus performants pour des exécutions simultanées comme Rust? Par exemple, y a-t-il des changements dans les implémentations de prédiction de branche ou les tailles de cache qui pourraient aider les exécutions simultanées?

J'ai l'impression que les conceptions actuelles du processeur pourraient être optimisées davantage pour des exécutions procédurales comme C. Si nous allions plutôt optimiser pour des exécutions simultanées, en quoi les processeurs seraient-ils différents?

Par exemple, la prédiction de branche a été mise en œuvre sur la base de généralisations établies dans des articles de recherche analysant les codes procéduraux. Je me demande si l'abstraction de concurrence ajoutera un ensemble de travail significatif à l'exécution qui aura un impact négatif sur les algorithmes de prédiction de branche existants. Par exemple, prédire dans une boucle for est une chose, mais lorsque la cible de la branche est toujours une nouvelle portion de mémoire (graphique, texte, etc.), ce sera toujours un échec de cache, et il n'y aura jamais de branche histoire pour elle-- parce que ni l'ont encore touché.

C'est probablement une question stupide parce que le contenu, bien qu'il puisse toujours être en RAM, sera ramifié à un ordre de grandeur inférieur à celui qu'il sera utilisé (une fois qu'il a été chargé dans le cache) ... mais quand même, il devrait être une limite temporelle observable aux contextes stockés dans le cache et les prédicteurs de branche dans un runtime procédural, qui se manifesterait comme une limite d'abstraction dans un environnement plus parallélisé. Je me demande donc ... Ces limites ont-elles été observées? Des articles de recherche ont-ils analysé cela?

Les architectures CPU sont-elles orientées vers le code procédural par rapport au code concurrent; ou les processeurs modernes sont-ils suffisamment polyvalents pour qu’un langage hautement simultané ne souffre pas?

paIncrease
la source
2
Avez-vous regardé la littérature autour de l'architecture Itanium (IA-64)? Il a été conçu avec de grands rêves d'ultraparallélisme, mais les gens n'ont pas réussi à créer des compilateurs qui tireraient parti des fonctionnalités du processeur, et le logiciel ne fonctionnait pas si bien après tout.
Gilles 'SO- arrête d'être méchant'
@ Gilles oui. Bien qu'une question différente, c'est en fait une observation intéressante - peut-être que le parallélisme cuit dans Itanium serait mieux adapté aux langages concurrents modernes?
paIncrease
@ Gilles: De même, la nouvelle architecture Mill semble avoir été construite avec le parallélisme et des commutateurs à faible coût à l'esprit. Par exemple, en utilisant un seul espace d'adressage virtuel pour tous les "processus", il repousse le TLB entre le dernier niveau de cache et les contrôleurs de périphérique (voir la diapositive 49 de millcomputing.com/docs/memory ).
Matthieu M.
1
@pedAntic Rust ayant besoin d'un runtime est une idée fausse facile à faire: chat.stackoverflow.com/transcript/message/24171983#24171983 . Votre question semble soutenir cette idée fausse qui n'est pas une bonne chose pour Rust.
ArtemGr
1
@pedAntic Vous voyez, Rust avait un runtime simultané (pour le filetage vert), mais ce n'est plus le cas. À l'heure actuelle, Rust est en grande partie dans la même ligue que C en ce qui concerne le profil de performance de la concurrence. La seule différence avec C est que l'analyse statique dans Rust rend la concurrence principalement sûre.
ArtemGr

Réponses:

1

Il est probablement plus vrai que les architectures informatiques modernes sont conçues dans le but d'améliorer la qualité du code généré par les compilateurs contre un budget de coût dans la zone de la matrice et la puissance utilisée. Les bibliothèques d'exécution ne sont qu'une instance spécifique de code compilé qui doit être exécutée de manière efficace.

Pendant très longtemps, le langage cible de la plupart des architectures a été le langage "C". Cela reflète les exigences modestes que ce langage impose à son matériel et le fait qu'il est devenu un langage de programmation de systèmes presque universel (Désolé Rust and Go, vous avez un long chemin à parcourir pour battre C).

Une conséquence de cela semble être que les nouveaux langages sont souvent définis en termes de leur sémantique équivalente C juste pour qu'ils évitent d'avoir besoin de processeurs qui sont probablement absents sur les ordinateurs actuels.

Le gain pour un processeur qui correspond bien aux compilateurs modernes est que le code de ces compilateurs fonctionne bien et que le processeur a au moins une chance d'être compétitif. Le coût de l'échec condamne le processeur avant qu'il ne démarre. Seuls deux exemples négatifs incluent l'iAPX-432 et l'Itanium, tous deux d'Intel. Les deux avaient une relation très médiocre avec leurs compilateurs (Ada et C respectivement), la défaillance des produits devenant un jeu de blâme entre le silicium et le logiciel.

Peter Camilleri
la source
0

Sans aucun doute, oui.

En particulier, le modèle de communication impliqué par C99 est la mémoire partagée. Les langages concurrents plus avancés ont des modèles de communication plus riches, tels que les canaux de transmission de messages (comme dans Rust).

Les architectures CPU modernes ont un support matériel explicite pour la mémoire partagée. En particulier, des protocoles de cohérence de cache comme MESI sont implémentés dans des portes et des fils réels. Il n'y a pas vraiment de support pour le passage de messages entre les processus, même si l'idée du passage de messages n'est pas étrangère aux processeurs. Les bus PCI-e modernes émulent même la mémoire partagée à l'aide de la transmission de messages, tandis que les processus CPU doivent émuler la transmission de messages à l'aide de la mémoire partagée!

MSalters
la source