Distance optimisée de la masortingce CUDA

Est-ce que quelqu’un connaît un kernel CUDA optimisé pour calculer une distance de type GEMM entre deux masortingces de dimension A x N et N x B? Le problème est presque identique à GEMM, mais calcule plutôt la sum (a_n! = B_n) pour chaque vecteur {1 … N} au lieu de multiplier et d’additionner chaque élément vectoriel.

Je voulais vérifier avant d’écrire le mien, car ce problème est relativement courant, mais je n’ai pas encore réussi à en trouver le code. Les suggestions de modification du code seraient également excellentes.

MODIFIER:

Outre les suggestions de kangshiyin ci-dessous, j’ai trouvé que cette présentation d’une implémentation SGEMM optimisée était extrêmement utile pour comprendre les étapes allant au-delà de l’exemple de multiplication de masortingce de mémoire partagée de base du Guide de programmation CUDA C.

    Vous avez raison de dire que vous pourriez écrire votre kernel en modifiant le code de gemm() . Les exemples CUDA ont une implémentation simple de gemm() , mais c’est trop simple. La performance est limitée par l’access à la mémoire partagée, ne donnant que ~ 250 Gflops sur les appareils Kepler. Pour des performances supérieures, vous pouvez vérifier le code gemm() dans MAGMA.

    http://icl.cs.utk.edu/magma/index.html

    Ces deux articles vous expliquent également comment mettre en œuvre et gemm() .

    http://staff.kfupm.edu.sa/ics/ahkhan/Resources/Papers/Autotuning/Autotuning%2520GEMM%2520Kernels%2520for%2520the%2520Fermi%2520GPU.pdf

    http://www.netlib.org/lapack/lawnspdf/lawn267.pdf

    Contrairement à gemm() qui prend en charge le matériel avec l’instruction FMA pour une opération de multiplication-addition rapide, l’opération souhaitée de comparaison-ajout peut nécessiter davantage d’instructions; par conséquent, les performances doivent être moindres. Considérant que la performance maximale de gemm() est d’environ 3 Tflops sur Kepler. Vous pourrez peut-être obtenir 0,5 ~ 2 Tflops pour le calcul de la masortingce de distance de Hamming.