主要内容

gpucoder.stridedMatrixMultiplyAdd

向的优化GPU实现,成批的矩阵乘法和加法运算

描述

D= gpucoder.stridedMatrixMultiplyAdd (一个,B,C)执行向一批矩阵的矩阵与矩阵的乘法和添加。输入矩阵一个,B,C对批处理的每个实例位于固定地址偏移量从他们的地址在前面的实例。的gpucoder.stridedMatrixMultiplyAdd函数执行矩阵与矩阵乘法的形式:

D = α 一个 B + β C

在哪里 α β 标量乘法因素,一个,B,C,D与维矩阵——- - - - - -k,k——- - - - - -n,——- - - - - -n,——- - - - - -n分别。一个B可以调换或hermitian-conjugated。默认情况下, α β 将一个矩阵的转置。指定一个不同的标量乘法因子和执行对输入矩阵转置操作,使用名称,值对参数。

所有的批次传递到gpucoder.stridedMatrixMultiplyAdd函数必须是统一的。也就是说,所有实例必须有相同的尺寸m, n, k

例子

___= gpucoder.stridedMatrixMultiplyAdd (___,名称,值)执行批处理矩阵乘法和加法运算通过使用一个或多个指定的选项名称,值对参数。

例子

全部折叠

执行一个简单的批处理和添加和使用矩阵与矩阵的乘法gpucoder.stridedMatrixMultiplyAdd函数来生成CUDA®代码调用适当的cublas < t > gemmStridedBatchedapi。

在一个文件中,写一个入口点函数myStridedMatMulAdd接受输入矩阵一个,B,C。因为输入矩阵转置,使用“神经网络”选择。

函数[D] = myStridedMatMulAdd (A, B, C,α,β)[D] = gpucoder.stridedMatrixMultiplyAdd (A, B, C,“α”α,“β”,β,“转置”,“神经网络”);结束

创建一个类型为双打用于代码生成的矩阵,使用coder.newtype函数。

一个= coder.newtype (“双”10、12、14],[0 0]);B = coder.newtype (“双”16 10],[14日,[0 0]);C = coder.newtype (“双”(12、16 10],[0 0]);α= 0.3;β= 0.6;输入= {A, B, C,α,β};

生成一个CUDA库,使用codegen函数。

cfg = coder.gpuConfig (“自由”);cfg.GpuConfig。EnableCUBLAS = true;cfg.GpuConfig。EnableCUSOLVER = true;cfg。GenerateReport = true;codegen配置cfg-args输入myStridedMatMulAdd

生成的CUDA代码包含内核myStridedMatMulAdd_kernelNN初始化输入和输出矩阵。还包含的代码cublasDgemmStridedBatchedAPI调用cuBLAS图书馆。下面的代码是生成的代码的一个片段。

/ / / /文件:myStridedMatMulAdd。铜…空白myStridedMatMulAdd (const双[1680],const双B [2240], const双C[1920],双α,β双,双D[1920]){双α1;. .α1 =α;beta1 =β;cudaMemcpy (gpu_C (void *)和c[0], 15360妳,cudaMemcpyHostToDevice);myStridedMatMulAdd_kernel1 < < < dim3 (4 u, 1 u, 1 u), dim3 (512 u, 1 u, 1 u) > > > (* gpu_C, * gpu_D);cudaMemcpy (gpu_alpha1α1 8妳cudaMemcpyHostToDevice);cudaMemcpy (gpu_A (void *)和[0],13440妳,cudaMemcpyHostToDevice);cudaMemcpy (gpu_B (void *)乙[0],17920妳,cudaMemcpyHostToDevice); cudaMemcpy(gpu_beta1, &beta1, 8ULL, cudaMemcpyHostToDevice); cublasDgemmStridedBatched(getCublasGlobalHandle(), CUBLAS_OP_N, CUBLAS_OP_N, 12, 16, 14, (double *)gpu_alpha1, (double *)&(*gpu_A)[0], 12, 168, (double *) &(*gpu_B)[0], 14, 224, (double *)gpu_beta1, (double *)&(*gpu_D)[0], 12, 192, 10); cudaMemcpy(&D[0], gpu_D, 15360ULL, cudaMemcpyDeviceToHost); ... }

输入参数

全部折叠

操作数,指定为向量或矩阵。列的数量一个必须等于中的行数B。的行数一个必须等于中的行数C。列的数量B必须等于列数C

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64
复数的支持:金宝app是的

名称-值参数

指定可选的逗号分隔条名称,值参数。的名字参数名称和吗价值相应的价值。的名字必须出现在引号。您可以指定几个名称和值对参数在任何顺序Name1, Value1,…,的家

例子:D = gpucoder.stridedMatrixMultiplyAdd (A, B, C,“阿尔法”,0.3,“beta”, 0.6,“转置”,“CC”);

使用的标量乘法的价值一个。默认值是1。

使用的标量乘法的价值C。默认值是1。

特征向量或两个字符组成的字符串,表示矩阵的操作执行一个B在矩阵乘法。可能的值是正常的(“N”)、转置(“T”),或复杂的共轭转置(“C”)。

输出参数

全部折叠

产品,作为一个标量返回向量或矩阵。数组D有相同数量的行作为输入一个和相同数量的列作为输入B

介绍了R2020a