2015-11-17 3 views
0

J'ai 2 matrices simples. A et B et moi calculons leur produit scalaire. Les tableaux ressemble à ceci (en utilisant numpy comme comme mockup)cublas Dgemm dot produit

A=np.array(([1,2,3],[4,5,6])).astype(np.float64) 
B=np.array(([7,8],[9,10],[11,12])).astype(np.float64) 

Voici les formes de la matrice

A: (2, 3)

B: (3, 2)

Maintenant, j'essaye de faire ceci using cublasDgemmBatched pour obtenir le produit.

Je suis confus sur ce que mes m, n et k valeurs doivent être lors de l'application cublasDgemmBatched. Aussi, je ne suis pas sûr de ce que ma dimension principale (lda, ldb, ldc) du tableau serait.

Il y a un nice 3d example ici, mais je ne peux pas sembler obtenir cette fonction pour travailler sur des matrices 2d

idéalement, je voudrais obtenir les mêmes résultats que np.dot

+1

Cela pourrait être parce que la gemm par lot est pour un tableau de matrices bidimensionnelles (ou ce que vous avez appelé des matrices tridimensionnelles). Si vous insistez vraiment sur l'utilisation de gemmbatched pour un tableau à deux dimensions, alors pour votre exemple: 'm = 2, n = 2, k = 3, lda = 3, ldb = 2, ldc = 2'. Bien que je ne peux pas dire avec confiance si cela fonctionnera ou non. Ou, en référence à l'exemple auquel vous avez lié, définissez simplement 'l = 1'. – inJeans

+1

Vous voudrez peut-être être un peu plus explicite sur ce que vous entendez par le produit scalaire de 2 matrices. La [définition] de matlab (http://www.mathworks.com/help/matlab/ref/dot.html) indique un ensemble de produits scalaires des colonnes de la matrice. L'implication est que les matrices auraient la même forme. Si vous voulez en effet un ensemble de produits scalaires individuels de colonnes matricielles, l'utilisation de gemm par lots n'est probablement pas la solution, car elle est assez [compilée à configurer] (http://stackoverflow.com/questions/23743384) et en utilisant un produit matriciel pour un produit scalaire vectoriel est exagéré je pense –

+0

Je voudrais obtenir les mêmes résultats que np.dot() – NinjaGaiden

Répondre

1

Je n'ai pas skcuda .blas pour le confirmer. Mais un exemple plus complet pourrait ressembler à

A = np.array(([1, 2, 3], [4, 5, 6])).astype(np.float64) 
B = np.array(([7, 8], [9, 10], [11, 12])).astype(np.float64) 

m, k = A.shape 
k, n = B.shape 

a_gpu = gpuarray.to_gpu(A) 
b_gpu = gpuarray.to_gpu(B) 
c_gpu = gpuarray.empty((m, n), np.float64) 

alpha = np.float64(1.0) 
beta = np.float64(0.0) 

a_arr = bptrs(a_gpu) 
b_arr = bptrs(b_gpu) 
c_arr = bptrs(c_gpu) 

cublas_handle = cublas.cublasCreate() 

cublas.cublasDgemm(cublas_handle, 'n','n', 
        n, m, k, alpha, 
        b_arr.gpudata, m, 
        a_arr.gpudata, k, 
        beta, c_arr.gpudata, m)