GPGPU
Le calcul d'usage universel de sur les unités de traitement de graphiques (GPGPU, également désigné sous le nom du ² de GPGP et à un moindre degré de généraliste) est une tendance récente concentrée sur employer le GPUs pour exécuter des calculs plutôt que l'unité centrale de traitement . L'addition des étapes programmables et de l'arithmétique de plus haute précision aux canalisations de rendu de a permis des programmateurs de logiciel de à d'employer GPUs pour non des applications connexes par graphiques. En exploitant l'architecture extrêmement parallèle de GPUs using le jet de traitant des approches de beaucoup de problèmes de calcul en temps réel du peuvent être accélérés considérablement.
Améliorations de GPU
La fonctionnalité de GPU a traditionnellement été très limitée. En fait, parce que beaucoup d'années le GPU a été seulement employé pour accélérer certaines parties de la canalisation de graphiques. Quelques améliorations étaient nécessaires avant que GPGPU soit devenu faisable.
Programmabilité
Les shaders programmables de sommet et de fragment de ont été ajoutés à la canalisation de graphiques pour permettre à des programmeurs de jeu de produire des effets bien plus réalistes. Les shaders de sommet permettent au programmeur de changer des attributs de par-sommet, tels que la position, la couleur, les coordonnées de texture, et le vecteur normal . Des shaders de fragment sont employés pour calculer la couleur d'un fragment , ou le par-Pixel. Les shaders programmables de fragment permettent au programmeur de substituer, par exemple, un modèle d'éclairage autre que ceux fournis par défaut par la carte graphique, l'ombrage en général simple de Gouraud de . Shaders ont permis à des programmeurs de graphiques de créer des effets d'objectif, le déplacement de traçant , et la profondeur de du champ .La programmabilité des canalisations ont tendu accordant les spécifications de DirectX du de Microsoft < ! -- comment ceci fonctionne : La milliseconde et l'IHVs travaillent ensemble pendant quelques années, puis une nouvelle fonctionnalité est annoncée pour DX. Tandis que DX attend pour être libéré, la même fonction est disponible comme prolongation de GL (les GS sont disponibles dans GL puisque quelques mois dès maintenant… ceci semble une simplification exagérée brute. Je devine l'utilisation d'IHV leur propre api -->, avec DirectX8 présentant le model 1.1 de Shader, DirectX8.1 le Pixel Shader modèle 1.4, et DirectX9 définissant le Shader 2. Chaque modèle de shader a augmenté les flexibilité modèles de programmation et les possibilités, assurant le matériel de conformation suivent le mouvement. Les spécifications DirectX10 présentent le model 4.0 de Shader qui unifie les spécifications de programmation pour le sommet, la géométrie (la « géométrie Shaders » sont nouvelle à DirectX10) et le fragment de traitant tenant compte d'un meilleur ajustement pour le matériel unifié de shader, de ce fait fournissant une piscine informatique simple de ressource programmable. fièvre paludéenne < ! -- Que fait ceci signifie ? En fait, les opcodes pour PS3.0 sont rudement semblables à VS3. En outre, je ne suis pas sûr les ressources suis vraiment " ; unified" ;. On le vérifiera ! -->
Types de données
Les cartes graphiques Pre-DirectX9 ont seulement soutenu les types paletted ou intégraux de couleur fièvre paludéenne < ! -- la gamme fixe est différente de l'intégrale -->. Les divers formats sont disponibles, chacun qui contient un élément rouge, un élément vert, et un élément bleu. Parfois une alpha valeur additionnelle est ajoutée, pour être employée pour le transparent. < ! -- que diriez-vous de l'alpha ? que diriez-vous de RG ou de formats de R ? Parlons-nous au sujet des formats de texture ou du calcul (toujours 4D) ? " ; Le transparent est des graphiques spécifiques ! Fait-il doit-il être cité ? --les formats de >Common sont :8 bits par Pixel - mode de palette fièvre paludéenne < ! -- Je n'ai pas connu des travaux de mode de palette avec des shaders. Cela ne fonctionne pas avec GL près sûr. -->, où chaque valeur est un index dans une table avec la valeur réelle de couleur spécifique dans un des autres formats. Probablement 2 bits pour le rouge, 3 bits pour le vert, et 3 bits pour le bleu.
16 bits par Pixel - habituellement assigné en tant que 5 bits pour le rouge, 6 bits pour le vert, et 5 bits pour le bleu.
24 bits par Pixel - 8 bits pour chacune de rouge, de vert, et le bleu
32 bits par Pixel - 8 bits pour chacune de rouge, de vert, de bleu, et l'alpha
Pour la première fonction fixe ou les graphiques limités de programmabilité (c. jusques et y compris DirectX8.1 GPUs conforme) c'était suffisant parce que c'est également la représentation utilisée dans les affichages. Cette représentation a certaines limitations, cependant. Les programmeurs suffisants donnés de graphiques de capacité de traitement de graphiques même voudraient employer de meilleurs formats, tels que des formats de données de la virgule flottante , afin d'obtenir des effets tels que la formation image élevée de dynamique de . Beaucoup d'applications de GPGPU exigent l'exactitude de virgule flottante, qui est venue avec des cartes graphiques conformément aux spécifications DirectX9.
DirectX9 Shader 2.x modèle a suggéré l'appui de deux types de précision : pleine et partielle précision. L'appui total de précision pourrait être FP32 et FP24 (bit de virgule flottante 24 par composant) ou plus grand, alors que la précision partielle était FP16. La série du R300 de du ATI de GPUs a soutenu la précision FP24 seulement dans la canalisation programmable de fragment (bien que FP32 a été soutenu dans les processeurs de sommet) tandis que le série du NV30 de s de NVIDIA la' soutenait FP16 et FP32 ; les autres fournisseurs tels que les graphiques du S3 et le XGI ont soutenu un mélange des formats jusqu'à FP24.0 de Shader a changé les spécifications, augmentant de pleines conditions de précision à un minimum d'appui FP32 dans la canalisation de fragment. La génération conforme du model 3.0 R5xx de Shader d'ATI (série de Radeon X1000 de ) soutient juste FP32 dans toute la canalisation tandis que la série du NV4x et du G7x de NVIDIA continuait à soutenir de pleines précisions la précision FP32 et le FP16 partielles. Bien que non stipulé par Shader Model 3.0 GPUs de Shader d'ATI et de NVIDIA a présenté le soutien de FP16 blendable rendent des cibles, plus faciles facilitant le soutien de High Dynamic Range Rendering.< ! -- J'appellerais plutôt ceci pour l'orthogonalité -->
Les réalisations de la virgule flottante sur le nVidia GPUs sont compliant< d'IEEE ! -- le nVidia indique qu'il est, elles ont INFs, NaNs -->, toutefois ce n'est pas vrai à travers tous les fournisseurs. < ! -- il ne s'assortit pas même avec Intel et AMD. Il est juste bien pour le point de gel. --> ceci a les implications pour l'exactitude qui sont considérées importantes pour quelques applications scientifiques. Tandis que 64 valeurs de virgule flottante de bit (flotteur à double précision) sont généralement disponibles sur des unités centrales de traitement, ce ne sont pas actuellement disponibles sur GPUs. Quelques applications exigent au moins des valeurs à double précision de virgule flottante et ne peuvent pas actuellement être mises en communication ainsi à GPUs fièvre paludéenne < ! --si l'algo est mal conditionné même la précision quadruple dans certains cas n'aidera pas. Il y a eu des efforts d'émuler des valeurs à double précision de virgule flottante sur GPUs.
La plupart des opérations sur le GPU fonctionnent d'une mode vectorisée : une opération simple peut être effectuée sur jusqu'à quatre valeurs immédiatement. Par exemple, si une couleur En novembre 2006 le NVIDIA a lancé le GeForce 8800 qui emploie le CUDA , un SDK et le api qui permet à un programmeur d'employer le langage de programmation du C pour coder des algorithmes pour l'exécution sur le GPU . Le ATI / AMD offre un SDK semblable pour leur GPUs ATI-basé et ces SDK et technologie s'appelle CTM ( près de métal ), conçu pour concurrencer directement le NVIDIA 's CUDA. Le CTM fournit une interface de matériel légèrement (l'interface de matériel mince) chapeau . AMD a également annoncé le produit du processeur de jet du AMD (combinant une unité centrale de traitement et une technologie de de GPU sur un morceau. Comparé, par exemple, aux accélérateurs traditionnels de la virgule flottante tels que le 64-bit CSX600 embarque du ClearSpeed qui est employé dans des ordinateurs géants d'aujourd'hui , le GPUs courant de de NVIDIA et AMD/ATI courent seulement sur à 32 bits, fournissant seulement des possibilités de données de simple-précision - au lieu des possibilités (64-bit) à double précision des ordinateurs géants d'aujourd'hui . NVIDIA a cependant énoncé dans le dossier de la version 0.8 de notes de dégagement de CUDA que l'arithmétique à double précision (64-bit) de soutien de virgule flottante de NVIDIA GPUs dans le matériel deviendra disponible vers la fin de 2007. Toujours, même sans véritable arithmétique à double précision de virgule flottante dans le matériel, CUDA et CTM sont une grande étape vers une plus large utilisation de technologie de GPGPU. voient également : Jet de traitant le GPUs peut seulement traiter des sommets et des fragments indépendants, mais peut traiter bon nombre d'entre elles en parallèle. C'est particulièrement efficace quand le programmeur veut traiter beaucoup de sommets ou de fragments de la même manière. Dans ce sens, GPUs sont les processeurs - les processeurs de jet de qui peuvent fonctionner en parallèle en courant un grain simple sur beaucoup de disques dans un jet immédiatement. Un jet est simplement un ensemble de disques qui exigent le calcul semblable. Les jets fournissent le parallélisme de données. Les grains sont les fonctions qui sont appliquées à chaque élément dans le jet. Dans le GPUs, les sommets et les fragments sont les éléments dans les jets et les shaders de sommet et de fragment sont les grains à courir sur eux. Puisque les éléments de processus de GPUs là n'est indépendamment aucune manière avoir partagé ou des données statiques. Pour chaque élément nous pouvons seulement lire de l'entrée, effectuer des opérations là-dessus, et écrire au rendement. Il est permis d'avoir les entrées multiples et les sorties multiples, mais jamais un morceau de mémoire qui est lisible et à affichage fièvre paludéenne . < ! -- peu clair : il est possible d'avoir des rangées provisoires. Avec G80 elles peuvent dynamiquement être aussi bien indexées même la picoseconde. --> L'intensité arithmétique est définie comme opérations effectuées par mot de mémoire transféré. Il est important que les applications de GPGPU aient l'intensité arithmétique élevée ou la latence d'accès mémoire limitera la vitesse de calcul. < ! -- Le nanovolt et l'ATi suggéré pour employer GPGPU même avec des conditions élevées de largeur de bande puisqu'ils transportent est beaucoup plus rapide que le " ; standard" ;. --> Les applications idéales de GPGPU ont de grands ensembles de données, parallélisme élevé, et dépendance minimale entre les éléments. En fait, le programmeur peut substituer une texture d'inscription seulement au rendement au lieu du framebuffer. Ceci est accompli par la Rendre-À-Texture (RTT), la Rendre-À-Backbuffer-Copie-À-Texture (RTBCTT), ou le plus récent < ! -- framebuffer_objects : svp ! c'est détail de GL, et c'est vraiment un RTT/backbuffer permutable--> jet-out< ! --jet-dehors sous DX10, transformer-rétroaction pour GL-->. Puisque des textures sont employées comme mémoire, des consultations de texture sont alors employées comme mémoire reads.< ! -- meilleur : il n'appelle pas dans les tcCoords de cause, qui peuvent être produits procédural --> certaines opérations peuvent être faites automatiquement par le GPU pour cette raison. < ! -- envisager d'enlever celui-ci. Il peut trivialement impliquer de savoir ce que l'interpolateur fait ! … Par exemple, il est commun pour spécifier des coordonnées de texture (c. adresses d'entrée) pour les coins d'un quadruple pleine page et avoir le GPU effectuer le travail de calculer l'adresse appropriée d'entrée pour chaque fragment produit. Ces données sont alors fournies au programmeur à aucun coût additionnel. --> X = 1e8 y = 1e8 faire la rangée X par y pour chaque " ; x" ; {Boucle de // ce temps de bloc 1e8 pour chaque " ; y" ; {Boucle de // ce temps de bloc 1e8 do_some_hard_work (x, y) // ceci est fait les périodes 1e16 (10 000 000 000 000 000) } } Sur le GPU, le programmeur spécifie seulement le corps de la boucle comme grain et quelles données à la boucle plus de par l'invoking< ! -- voir Spéc. les bruits améliorent vu le contexte --> traitement de la géométrie. GPUs récent laissent s'embrancher, mais habituellement avec une pénalité d'exécution. L'embranchement devrait généralement être évité dans les boucles intérieures, si en code d'unité centrale de traitement ou de GPU, et diverses techniques, telles que la résolution statique de branche, le pré-calcul, et le Z-cull peuvent être employés pour réaliser l'embranchement quand l'appui de matériel n'existe pas. Le processeur de fragment ne peut pas effectuer une opération directe d'éparpillement parce que l'endroit de chaque fragment sur la grille est fixe à l'heure de la création du fragment et ne peut pas être changé par le programmeur. Cependant, une opération logique d'éparpillement peut parfois être remaniée ou mise en application avec une étape additionnelle de rassemblement. Une exécution d'éparpillement émettrait la première fois une valeur de rendement et une adresse de rendement. Juste après les utilisations d'une opération de rassemblement adressent des comparaisons pour voir si produire des cartes de valeur à la fente de rendement courant. Concepts de programmation de GPGPU
GPUs sont conçus spécifiquement pour des graphiques et sont ainsi très restrictif en termes d'opérations et programmation. En raison de leur nature GPUs être seulement efficace à aborder les problèmes qui peuvent être résolus using le jet de traitant et le matériel peut seulement être utilisé de certaines manières. Procédé de jet
Concepts de programmation de GPU
Ressources informatiques
Il y a une série de ressources informatiques disponibles sur le GPU :
Processeurs programmables - les canalisations de sommet, de primitif et de fragment permettent au programmeur d'exécuter le grain sur des jets des données
Traceur par ligne - crée des fragments et interpole des constantes de par-sommet telles que des coordonnées et la couleur de texure
Unité de texture - interface de mémoire fixe
Framebuffer - écrire seulement l'interface de mémoire Textures comme jet
La forme la plus commune pour qu'un jet rentre GPGPU est une 2D grille parce que ceci équipe naturellement du modèle de rendu établi dans GPUs. Beaucoup de calculs tracent naturellement dans des grilles : algèbre de matrice, à traitement d'images, simulation physiquement basée, et ainsi de suite. < ! -- c'est superflu, insignifiant et pourrait être impliqué du texte ci-dessus. En outre il retentit plutôt un détail de l'exécution sanglant. Si ce n'est pas assez, il doit être mis à jour pour le jet-dehors… Une manière commune d'effectuer des opérations sur une grille est de dessiner un quadruple classé par écran, qui crée un fragment pour chaque Pixel. Un programme de fragment est lancé sur chaque fragment et le Pixel en résultant est stocké dans l'amortisseur d'armature pour l'affichage. Si l'algorithme implique des étapes multiples, la Rendre-À-Texture (RTT) ou la Copie-À-Texture (CTT) peut être employée pour stocker le résultat à une texture, qui peut alors être lue comme entrée pour la prochaine étape. --> Grains
Des grains peuvent être considérés comme corps des boucles. Par exemple, si le programmeur fonctionnait sur une grille sur l'unité centrale de traitement il pourrait avoir le code qui a ressemblée à ceci : Pseudo-code de/* *
Contrôle de flux
Dans des programmes réguliers il est possible de commander l'écoulement du programme using si puis - des rapports d'autre et de diverses formes de boucles. De telles structures de contrôle de flux ont été ajoutées tout récemment à GPUs.< ! --pas vraiment, l'embranchement pourrait être mis à zéro dehors même sur NV20, qui donne rudement le même résultat--> conditionnel écrit pourrait faire using une série des instructions plus simples fièvre paludéenne , mais le bouclage et l'embranchement conditionnel n'étaient pas possibles. Techniques de GPU
Carte
L'opération de carte s'applique simplement la fonction donnée (le grain) à chaque élément dans le jet. Un exemple simple multiplie chaque valeur dans le jet par une constante (augmentant l'éclat d'une image). L'opération de carte est simple pour mettre en application sur le GPU. Le programmeur produit d'un fragment pour chaque Pixel sur l'écran et s'applique un programme de fragment à chacun. Le jet de résultat des mêmes tailles est stocké dans l'amortisseur de rendement. Réduire
Quelques calculs exigent calculer un plus petit jet (probablement un jet de seulement 1 élément) d'un plus grand jet. Ceci s'appelle une réduction du jet. Généralement une réduction peut être accomplie des étapes multiples. Les résultats de l'étape précédente sont employés pendant que l'entrée pour l'étape courante et la gamme au-dessus desquelles l'opération est appliquée est réduite jusqu'à seulement un élément de jet reste. Filtrage de jet
Le filtrage de jet est essentiellement une réduction non-uniforme. Le filtrage implique d'enlever des articles du jet basé sur quelques critères. Éparpillement
L'opération d'éparpillement le plus naturellement est définie sur le processeur de sommet. Le processeur de sommet peut ajuster la position du sommet , qui permet au programmeur de commander où l'information est déposée sur la grille. D'autres prolongements sont également possibles, comme commander combien grand un secteur le sommet affecte. Rassemblement
< ! -- Les textures de sommet sont banales en ce moment. --le processeur de fragment de >The peut lire des textures d'une mode à accès sélectif, ainsi elle peut recueillir l'information de n'importe quelle cellule de grille, ou les cellules de grille multiples, comme désirées fièvre paludéenne < ! --mais ce ne serait pas la grille courante, plutôt celle qui ont été déjà traités. < ! -- même s'applique pour des chemins de Pixel ! C'est injustifié ! Le seul " ; true" ; le rassemblement serait alors ddx () et ddy (). Les cartes graphiques récentes tiennent compte pour que le processeur de sommet lise des données de texture, mais ce n'est pas vraiment une opération de rassemblement puisque le rassemblement ne fonctionne pas sur le jet de sommet lui-même. --> Sorte
L'opération de sorte transforme un ensemble non commandé d'éléments en jeu commandé d'éléments. L'exécution la plus commune sur GPUs emploie le assortissant les réseaux .
Random links: Maria Romanova | Comté de rue Clair, Michigan | Automnes de Klamath, Orégon | Zavalla, le Texas | Laurence Hartnett | GPGPU