élimination gaussienne

élimination gaussienne vise à transformer un système d'équations linéaires dans une matrice triangulaire supérieure dans le but de résoudre les inconnues et obtenir une solution. Une colonne de pivotement est utilisée pour réduire les lignes devant lui; puis, après la transformation, avant la substitution est appliquée.







élimination de Gauss est une méthode pour résoudre les équations de matrice de la forme

(1) Pour réaliser l'élimination de Gauss en commençant par le système d'équations

(4) résoudre l'équation de la ième rangée pour. puis substituer dans l'équation de la (k-1) ème rangée de
obtenir une solution pour Xk-1, etc., selon la formule

nbspnbspfor (int i = 0; i

résultats parallèles MPI en utilisant 2 processeurs

Depuis le ammount de temps pour effectuer l'étape de substitution est minime en arrière par rapport à l'élimination de l'avant, il est préférable de faire de manière séquentielle.

Les tableaux ci-dessus montrent les dépenses de temps à faire des calculs vs communications réseau pour la phase d'élimination de l'avant.

L'aspect le plus important de l'élimination gaussienne est temps de communication. Étant donné que l'algorithme repose sur tant de données de travail connexes (par opposition à la tâche connexe) le temps de communication de la mémoire non partagée MPI implimentation éclipsent largement le temps de charge de travail. Par conséquent, cette solution MPI est inférieure à un implimentation-mémoire partagée sur la même machine.

Cet exemple élimination gaussienne par Farhan Ahmad utilise l'algorithme standard avec le dos de substitution pour résoudre un système linéaire. Il est implémenté en C ++ en utilisant les extensions standards CUDA C. Les données sont lues à partir d'un fichier texte pour charger les matrices. Vous pouvez consulter et télécharger le code source d'Ahmad ici.







DeviceFunc.cu

#ifndef __Common_H #define __Common_H #endif getvalue void (float ** int *.); annuler DeviceFunc (float * int float *..);

Le code est relativement simple. Parce qu'il est en C ++, la fonction principale est compilé séparément à partir du code CUDA. Cette partie du programme est exécuté sur le processeur standard comme un programme C ++ régulier de l'hôte. Il lit les données à partir d'un fichier externe. puis transfère le contrôle au dispositif de DeviceFunc.cu. Ici, la mémoire est allouée et transféré du processeur principal à l'unité de traitement graphique. Il prépare une configuration d'exécution et lance alors le noyau, qui est le code élimination gaussienne réelle fonctionner en parallèle par le GPU.

Bien que l'élimination gaussienne « typique » peut se faire en CUDA, plusieurs études ont montré qu'il existe des moyens plus efficaces de paralléliser l'algorithme en faisant quelques ajustements. Dans une étude réalisée par Xinggao Xia et Jong Chul Lee, plutôt que de dégager uniquement les lignes avant le pivot, toutes les autres lignes sont réduites à zéro. Une fois que chaque colonne est terminée, pas de retour de substitution est nécessaire. Pivot partiel est également utilisé pour assurer l'exactitude de la réponse.

Dans une autre étude par Aydin Buluc, John Gilbert, et Ceren Budak, ils ont noté que si récursion n'est pas possible sur un GPU CUDA, il est sur le processeur hôte. Si récursion est utilisé sur l'hôte, il sépare la pile de récursion des opérations à virgule flottante effectuées par le GPU, de sorte que l'on ne gêne pas l'autre. Ils utilisent cette technique dite « récursive optimisée », ainsi que d'autres améliorations comme la mémoire et coalescent optimisés variables primitives afin d'atteindre un maximum speedup.

La présentation de Xia et Lee se trouve ici.
Buluc et. Al. de » document sur les différents algorithmes de style-élimination de Gauss pour GPGPU se trouve ici.







Articles Liés