Au lieu de programmer comme nous le faisons, pourquoi ne faisons-nous pas de spécifications de tâches courantes telles que le "tri", puis laissons-nous l'environnement le compiler pour utiliser au mieux son matériel? De cette façon, nous pourrions expédier un ordinateur avec un nouveau matériel spécialisé tel que des réseaux de tri, et cela fonctionnerait automatiquement avec le code existant.
programming-languages
hardware
sorting
MaiaVictor
la source
la source
Réponses:
Tout d'abord, les ordinateurs sont livrés avec du matériel spécialisé . Chaque ordinateur portable et de bureau vendu depuis quelques années dispose désormais d'un coprocesseur spécialisé, une unité de traitement graphique, qui gère les algorithmes de traitement visuel, tels que les applications vidéo et de jeu l'exigent. Très gros ordinateurs ( par exemple , « supercalculateurs », IBM System famille Z) ont une variété de processeurs spécialisés pour gérer le traitement numérique ( « traitement vectoriel »), etc .
Deuxièmement, le tri est l'un des aspects les plus étudiés de l'informatique et s'avère beaucoup trop complexe pour être intégré dans du matériel pour plus que les cas les plus simples. Le tri est une question de vitesse et d'exactitude. La vitesse dépend du choix de l'algorithme, du type et de la variation des données et du volume de données. L'exactitude dépend du type et du contexte des données. Il est très trivial de trier un tableau d'entiers de taille moyenne qui tiennent dans la taille du mot natif du processeur ( par exemple, 31 ou 63 bits plus signe). Le tri des chaînes de caractères qui contiennent plus que de simples valeurs ASCII est extrêmement complexe - IBM a publié il y a plus de 20 ans un livre de plus de 500 pages sur les problèmes des jeux de caractères dans le contexte des frontières nationales et de l'usage courant. Et puis, il y a la question des données non contiguës - le tri d'une liste chaînée implique de rechercher des pointeurs sur toute la mémoire.
la source
Le problème principal est que les algorithmes de tri (1) ont besoin de beaucoup de flexibilité et (2) seraient de toute façon très difficiles à accélérer en utilisant du matériel.
Une chose est que les algorithmes de tri sont déjà assez rapides pour dépasser la bande passante mémoire du processeur - le processeur passera déjà une grande partie de son temps à attendre que les données se déplacent en arrière et en avant vers la mémoire principale. Un coprocesseur de tri accéléré par matériel ou une instruction de tri spéciale aurait le même problème.
La façon dont cette bande passante mémoire est traitée consiste à utiliser de meilleurs algorithmes et des structures de données qui ont une meilleure «localité», et il y a encore un travail important à faire dans ce domaine, en particulier les «algorithmes inconscients du cache» (ils sont inconscients dans le sens où ils fonctionnent). bien quels que soient les détails de la mise en cache, alors que les algorithmes "sensibles au cache" sont réglés pour une taille de page de cache particulière, etc.).
En revanche, les applications multimédias (audio et graphiques, en particulier les graphiques 3D) utilisent des structures très répétitives - bien sûr, il y a de la flexibilité, mais elles sont construites sur une base large et très bien structurée. Cela a permis à l'accélération graphique de commencer simplement avec des choses comme Blitting (une opération de copie de bloc configurable mais toujours très structurée) et le dessin de ligne / polygone. Cela signifiait que les graphiques et le traitement du son devenant plus sophistiqués, les opérations vectorielles devinrent une cible évidente pour l'optimisation - d'abord MMX (vecteurs d'entiers) puis SSE (vecteurs de flottants). Cela signifiait qu'il y avait une structure assez bien définie pour le fonctionnement d'un moteur graphique 3D lorsque l'ancien pipeline de graphiques 3D à fonction fixe a été déplacé sur du matériel graphique 3D.
Pourtant, avec les graphiques 3D, ce qui était autrefois fait dans le matériel l'est maintenant dans le logiciel pour plus de flexibilité - les shaders sont des logiciels, par exemple, c'est ainsi que nous obtenons une vaste gamme de shaders différents donnant l'apparence de différents matériaux. Cependant, ce logiciel fonctionne toujours de manière beaucoup plus structurée que les logiciels généraux, et peut donc toujours utiliser une plate-forme matérielle beaucoup plus spécialisée. C'est pourquoi votre carte graphique peut désormais tout accélérer, de la physique au cracking des mots de passe - des applications qui correspondent également au même modèle et peuvent être mises en œuvre efficacement à l'aide des jeux d'instructions fournis par les processeurs graphiques modernes.
Les processeurs graphiques sont maintenant les descendants spirituels ou réels des processeurs de signaux numériques, qui étaient (et sont probablement toujours) une sorte de processeur spécialisé pour traiter les signaux numériques (par exemple audio).
Ce qui conduit à un point final - les algorithmes de tri peuvent être accélérés par le matériel. Selon vos données, le tri peut être géré à l'aide d'instructions MMX ou SSE (single-instruction-multiple-data) sur votre processeur, mais il n'y a probablement pas grand-chose à cause du problème de bande passante mémoire - peut-être pouvez-vous être un peu plus économe en énergie de cette façon, cependant. Cependant, vous pouvez également utiliser votre matériel graphique. De cette façon, vous pouvez bénéficier d'une bande passante mémoire souvent bien meilleure pour les cartes graphiques. Vous ne pourrez pas remplacer toutes sortes de cette façon, mais c'est certainement possible et probablement fait le cas échéant.
IOW en raison des divers problèmes économiques et pratiques, concevoir du matériel spécifiquement pour accélérer une tâche relativement étroite comme le tri n'a pas vraiment de sens. Une fonctionnalité qui accélère une gamme plus large de tâches ou qui rend le matériel d'accélération existant applicable à une gamme plus large de tâches a souvent beaucoup plus de sens.
la source
Mais ils le font! On les appelle des extensions de jeu d'instructions. (Des trucs comme SSE et similaires)
Certaines tâches ont de très belles implémentations dans les logiciels. Habituellement, ces implémentations sont assez bonnes pour faire le travail, donc aucun matériel spécialisé n'est nécessaire. Si vous voulez créer une sorte de matériel spécialisé, vous aurez besoin d'avoir une très large gamme d'applications pour que cela en vaille la peine.
Si vous regardez le matériel qui pourrait faire fonctionner cela, je suppose que vous regarderiez quelque chose comme des FPGA. Comme vous pouvez le voir avec les FPGA, la puce deviendrait beaucoup plus chère alors qu'elle ne serait pas applicable à de nombreuses applications.
la source