4 votes

Est-il sûr de passer à GEMV le même vecteur de sortie que celui d'entrée pour obtenir une application de matrice destructive ?

Si A est un n x n et la matrice x un vecteur de dimension n est-il alors possible de passer x a GEMV comme argument à la fois pour le x y y avec le paramètre beta=0 pour réaliser l'opération x A x ?

Je suis spécifiquement intéressé par l'implémentation de Cublas, avec interface C.

6voto

Ian Bush Points 2389

Non. Et pour Fortran, cela n'a rien à voir avec l'implémentation - En Fortran, il est contraire à la norme du langage d'avoir des arguments réels aliasés pour cualquier sous-programme car il rompt la norme du langage sauf si ces arguments sont des Intent(In). Ainsi, si l'interface a des arguments fictifs qui sont Intent(Out), Intent(InOut) ou qui n'ont pas d'Intent, vous devez toujours utiliser des variables séparées pour les arguments réels correspondants lorsque vous invoquez le sous-programme.

1voto

Pavan Yalamanchili Points 6637

NON.

Chaque élément de la sortie dépend de TOUTES éléments du vecteur d'entrée x

Par exemple : si x est l'entrée et y est la sortie, A est la matrice, Le site i e élément de y serait généré de la manière suivante.

y_i = A_i1*x_1 + A_i2 * x_2 ... + A_in * x_n

Donc si vous écrasez x_i avec le résultat ci-dessus, d'autres x_r qui dépend de x_i ne recevra pas les données appropriées et produira des résultats incorrects.

EDIT

J'allais en faire un commentaire, mais il devenait trop gros. Voici donc l'explication de la raison pour laquelle le raisonnement ci-dessus est également valable pour les implémentations parallèles.

À moins que chaque groupe ou fil parallèle ne fasse une copie locale des données d'origine, auquel cas les données d'origine peuvent être détruites, ce raisonnement est valable.

Cependant, cette façon de faire (copie locale) n'est pratique et bénéfique que lorsque

  1. Chaque thread/bloc parallèle ne serait pas en mesure d'accéder au fichier tableau original sans une quantité significative d'over-head.
  2. Il y a assez local mémoire (qu'il s'agisse de cache, de mémoire partagée ou même de mémoire ordinaire dans le cas de MPI) afin de conserver une copie séparée pour chaque thread / bloc parallèle.

Notes :

  • (1) peut ne pas être vrai pour de nombreuses applications multithreadées sur une seule machine.
  • (1) peut être vrai pour CUDA mais (2) n'est absolument pas applicable pour CUDA.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X