cuBLAS Dgemm产品与python

问题描述 投票:1回答:2

我有2简单矩阵AB,我正在计算它们的乘法。数组看起来像这样(使用numpy作为模型)

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

以下是Matrix的形状

A: (2, 3)

B: (3, 2)

现在,我正在尝试使用cublasDgemmBatched来获取产品。

我很困惑应用cublasDgemmBatched时我的m,n和k值应该是多少。另外,我不确定阵列的主要尺寸(ldaldbldc)是什么。

这里有一个nice 3d example,但我似乎无法使用这个函数来处理2d矩阵。

理想情况下,我希望得到与np.dot相同的结果。

python matrix cuda pycuda cublas
2个回答
1
投票

我没有skcuda.blas来证实这一点。但是更完整的例子可能看起来像

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)

0
投票

模仿np.dot()的一个非常简单的方法是使用culinalg.dot(),后面使用cuBLAS,请参阅skcuda.linalg.dot。下面是一个简单的例子:

import pycuda.autoinit
import pycuda.gpuarray as gpuarray
import pycuda.driver as drv
import numpy as np

import skcuda.linalg as culinalg
import skcuda.misc as cumisc
culinalg.init()

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

A_gpu = gpuarray.to_gpu(A)
B_gpu = gpuarray.to_gpu(B)

C_gpu = culinalg.dot(A_gpu, B_gpu)

print(np.dot(A, B))
print(C_gpu)
© www.soinside.com 2019 - 2024. All rights reserved.