python 的 cuBLAS Dgemm 产品
cuBLAS Dgemm product with python
我有 2
个简单矩阵 A
和 B
,我正在计算它们的乘法。
数组看起来像这样(使用 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)
这是矩阵的形状
A: (2, 3)
B: (3, 2)
现在,我正在尝试使用 cublasDgemmBatched 来获取产品。
我对应用 cublasDgemmBatched
时我的 m、n 和 k 值应该是什么感到困惑。
另外,我不确定数组的前导维度(lda
、ldb
、ldc
)是多少。
这里有一个 nice 3d example 但我似乎无法让这个函数在二维矩阵上工作。
理想情况下,我希望获得与 np.dot 相同的结果。
我没有 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)
一个非常简单的模仿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)
我有 2
个简单矩阵 A
和 B
,我正在计算它们的乘法。
数组看起来像这样(使用 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)
这是矩阵的形状
A: (2, 3)
B: (3, 2)
现在,我正在尝试使用 cublasDgemmBatched 来获取产品。
我对应用 cublasDgemmBatched
时我的 m、n 和 k 值应该是什么感到困惑。
另外,我不确定数组的前导维度(lda
、ldb
、ldc
)是多少。
这里有一个 nice 3d example 但我似乎无法让这个函数在二维矩阵上工作。
理想情况下,我希望获得与 np.dot 相同的结果。
我没有 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)
一个非常简单的模仿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)