6
votes

Blas et cublys

Je me demande à propos de la bibliothèque de Cublas de Nvidia. Quelqu'un en a-t-il de l'expérience? Par exemple, si j'écris un programme C en utilisant blas, vais-je pouvoir remplacer les appels en blas avec des appels à CublaS? Ou même mieux mettre en œuvre un mécanisme qui permettrons à l'utilisateur de choisir au moment de l'exécution?

Quoi de dire si j'utilise la bibliothèque de Blas fournie par Boost avec C ++?


0 commentaires

3 Réponses :


2
votes

CublaS ne s'enroule pas autour de Blas. Cubla accède également à des matrices dans une commande majeure de colonne, telle que certains codes fortran et blas.

Je suis plus utilisé pour écrire du code en C, même pour Cuda. Un code écrit avec Cblas (qui est une enveloppe C de Blas) peut facilement être un changement en code CUDA. Sachez que les codes FORTRAN utilisant des blas sont très différents des codes C / C ++ utilisant des CBLAS. Fortran et Blas stockent normalement des matrices ou des tableaux doubles dans la commande de colonne. Mais C / C ++ gère normalement la commande principale-majeure. Je gère normalement ce problème écrit en sauvegarde les matrices dans des tableaux 1D, et utilisez #define pour écrire une macro toa accéder à l'élément I, J d'une matrice comme suit: xxx

bibliothèque CBLAS contient un puits de paramètres et des conventions (Cons-enum variables) donner à chaque fonction la commande de la matrice. Méfiez-vous que le stockage des matrices varie également, une matrice à bande à bande de ligne n'est pas stockée identique à une matrice de bande de colonne.

Je ne pense pas qu'il y ait des mécaniciens pour permettre à l'utilisateur de choisir entre l'utilisateur en utilisant blas ou cubly, sans écrire le code deux fois. CublaS a également sur la plupart des appels de fonction une variable "poignée" qui n'apparaît pas sur Blas. Je pense que #define pour changer le nom à chaque appel de fonction, mais cela pourrait ne pas fonctionner.


0 commentaires

1
votes

J'ai porté le code BLAS à Cubla. La bibliothèque de Blas que j'utilise est Atlas, alors ce que je dis peut être correct que pour le choix de la bibliothèque de Blas.

Atlas Blas exige que vous spécifiez si vous utilisez la commande de colonne de la colonne ou de la commande majeure de la ligne, et j'ai choisi la colonne majeure commande depuis que j'utilisais Clapack qui utilisait Colonne majeur commande. Lapacke d'autre part utiliserait une commande majeure en ligne. Cubla est une commande majeure de colonne. Vous devrez peut-être ajuster en conséquence.

Même si la commande n'est pas un problème de portage à Cublas n'était en aucun cas une chute de remplacement. Le problème le plus important est que vous devez déplacer les données sur et hors de l'espace mémoire du GPU. Cette mémoire est configurée à l'aide de Cudamalloc () et publiée avec Cudafree () qui agit comme on pouvait s'attendre. Vous déplacez des données dans la mémoire GPU à l'aide de cudamemcpy (). Le temps de faire cela sera un facteur déterminant important sur s'il est utile de passer de la CPU à GPU.

Une fois que cela fait cependant, les appels sont assez similaires. Cblasnotrans devient Cublas_op_n et Cblastrans deviennent CublaS_OP_T. Si votre bibliothèque BLAS (en tant qu'Atlas le fait) vous permet de passer des scalaires par valeur, vous devrez convertir cela pour passer par référence (comme est normal pour FORTRAN).

Étant donné cela, tout commutateur permettant un choix de processeur / GPU serait le plus facilement supérieur à celui de la fonction utilisant Blas. Dans mon cas, j'ai des variantes de la CPU et du GPU de l'algorithme et les ont choisies à un niveau supérieur en fonction de la taille du problème.


0 commentaires

5
votes

La réponse de JANNEB est incorrecte, CublaS est pas Remplacement d'une liste déroulante pour une CPU Blas. Il suppose que les données sont déjà sur l'appareil et les signatures de fonction ont un paramètre supplémentaire pour garder une trace d'un contexte Cubla.

Cependant, dans CUDA 6.0 est une nouvelle bibliothèque appelée NVBLAS qui fournit exactement cette fonctionnalité "dépose". Il intercepte les appels de niveau3 Blas (Gemm, TRSV, etc.) et les envoie automatiquement à la GPU, cartographier efficacement le transfert PCIe avec le calcul sur GPU.

Il y a quelques informations ici: https://developer.nvidia.com/cublasxt et Cuda 6.0 est disponible pour Cuda Développeurs enregistrés aujourd'hui.

Les documents complets seront en ligne une fois que Cuda 6.0 est libéré au grand public.


0 commentaires