2015-08-21 3 views
1

Actuellement, j'essaie simplement de mettre en œuvre un algorithme de régression linéaire simple sous forme matricielle basé sur cuBLAS avec CUDA. La multiplication de matrice et la transposition fonctionnent bien avec la fonction cublasSgemm.Inversion de matrice CUDA en référençant le pointeur CUDA

Les problèmes commencent par des inversions matricielles, basées sur les fonctions cublas<t>getrfBatched() et cublas<t>getriBatched() (voir here).

Comme on peut le voir, les paramètres d'entrée de ces fonctions - des tableaux de pointeurs aux matrices. Figurez-vous, que je l'ai déjà alloué la mémoire pour la matrice (A^T * A) sur le GPU en raison de calculs précédents:

float* dProdATA; 
cudaStat = cudaMalloc((void **)&dProdATA, n*n*sizeof(*dProdATA)); 

Est-il possible d'exécuter factorisation (inversion)

cublasSgetrfBatched(handle, n, &dProdATA, lda, P, INFO, mybatch); 

sans HOST supplémentaire < -> copie de mémoire GPU (voir working example of inverting array of matrices) et l'allocation de tableaux avec un seul élément, mais juste obtenir GPU-référence à GPU-pointeur?

Répondre

1

Il n'y a aucun moyen de contourner l'exigence que la matrice que vous passez soit dans l'espace d'adressage du périphérique, et ce que vous avez posté dans votre question ne fonctionnera pas. Vous n'avez réellement que deux possibilités:

  1. Allouer une matrice de pointeurs sur le périphérique et effectuer le transfert de mémoire (la solution que vous ne voulez pas utiliser).
  2. Utilisez zéro copie ou gérée la mémoire hôte pour stocker le tableau de lots

Dans ce dernier cas avec la mémoire gérée, quelque chose comme cela devrait fonctionner (complètement non testé, utilisez à vos propres risques):

float ** batch; 
cudaMallocManaged((&batch, sizeof(float *)); 
*batch = dProdATA; 
cublasSgetrfBatched(handle, n, batch, lda, P, INFO, mybatch); 
+0

Merci! Mais j'ai peur que l'utilisation de la mémoire gérée puisse être une raison pour que la vitesse de calcul diminue. –