主要内容

gpucoder.batchedMatrixMultiplyAdd

优化的GPU批量矩阵乘法与加法运算的实现

描述

D1,D2] = gucoder . batchedmatrixmultiplyadd (一个1,B1,C1,一个2,B2,C2)执行一批矩阵的矩阵乘法和加法A1, B1, C1而且A2、B2、C2.的gpucoder.batchedMatrixMultiplyAdd函数执行如下形式的矩阵-矩阵乘法:

D α 一个 B + β C

在哪里 α 而且 β 标量乘法是和吗一个BC,D都是有维的矩阵——- - - - - -kk——- - - - - -n——- - - - - -n,——- - - - - -n分别。一个而且B可以选择转置或隐式共轭。默认情况下, α 而且 β 设为1,矩阵没有转置。若要指定不同的标量乘法因子并对输入矩阵执行转置运算,请使用名称,值对参数。

所有批次传递给gpucoder.batchedMatrixMultiplyAdd函数必须是均匀的。也就是说,所有实例必须具有相同的维度m, n, k

D1、……DN] = gucoder . batchedmatrixmultiplyadd (一个1,B1,C1、……一个N,BN,CN)执行矩阵-矩阵乘法和倍数相加一个BC矩阵的形式为:

D α 一个 B + β C 1 ... N

例子

___= gpucoder.batchedMatrixMultiplyAdd (___名称,值使用一个或多个指定的选项执行批处理矩阵乘法和加法操作名称,值对参数。

例子

全部折叠

函数执行简单的批量矩阵-矩阵乘法运算gpucoder.batchedMatrixMultiplyAdd函数生成CUDA®调用适当的代码cublas < t > gemmBatchedapi。

在一个文件中,编写一个入口点函数myBatchMatMulAdd接受矩阵输入A1B1C1A2B2,C2.因为输入矩阵没有转置,所以使用“神经网络”选择。

函数[D1,D2] = myBatchMatMulAdd(A1,B1,C1,A2,B2,C2,alpha,beta) [D1,D2] = gpucoder.batchedMatrixMultiplyAdd(A1,B1,C1,A2,B2,C2, alpha,beta)...“α”α,“β”,β,“转置”“神经网络”);结束

要为在代码生成中使用的double类型矩阵创建类型,请使用coder.newtype函数。

A1 = code .newtype(“双”(12、14),[0 0]);A2 = code .newtype(“双”(12、14),[0 0]);B1 = code .newtype(“双”(14、16),[0 0]);B2 = code .newtype(“双”(14、16),[0 0]);C1 = code .newtype(“双”(12、16),[0 0]);C2 = code .newtype(“双”(12、16),[0 0]);Alpha = 0.3;Beta = 0.6;input = {A1,B1,C1,A2,B2,C2,alpha,beta};

要生成CUDA库,请使用codegen函数。

cfg = code . gpuconfig (“自由”);cfg. gpconfig . enablecublas = true;cfg. gpconfig . enablecusolver = true;cfg。GenerateReport = true;codegen配置cfg-args输入myBatchMatMulAdd

生成的CUDA代码包含内核myBatchMatMulAdd_kernelNN用于初始化输入和输出矩阵。代码还包含cublasDgemmBatchedAPI调用cuBLAS库。下面的代码是生成的代码片段。

// //文件:myBatchMatMulAdd。Cu //…void myBatchMatMulAdd(const double A1[168], const double B1[224], const double C1[192], const double A2[168], const double B2[224], const double C2[192],双alpha,双beta,双D1[192],双D2[192]){双alpha1;...myBatchMatMulAdd_kernel2<<>>(*gpu_B2, *gpu_B1, *gpu_input_cell_f4, *gpu_input_cell_f3);cudaMemcpy(gpu_C2, (void *)&C2[0], 1536UL, cudaMemcpyHostToDevice);cudaMemcpy(gpu_C1, (void *)&C1[0], 1536UL, cudaMemcpyHostToDevice);myBatchMatMulAdd_kernel3<<>>(*gpu_C2, *gpu_C1, gpu_r3, gpu_r2);myBatchMatMulAdd_kernel4<<>>(gpu_r2, *gpu_out_cell);myBatchMatMulAdd_kernel5<<>>(gpu_r3, *gpu_out_cell);... cublasDgemmBatched(getCublasGlobalHandle(), CUBLAS_OP_N, CUBLAS_OP_N, 12, 16, 14, (double *)gpu_alpha1, (double **)gpu_Aarray, 12, (double **)gpu_Barray, 14, (double *)gpu_beta1, (double **) gpu_Carray, 12, 2); myBatchMatMulAdd_kernel6<<>>(*gpu_D2, ... }

输入参数

全部折叠

操作数,指定为向量或矩阵。一个B,C必须是二维数组。的列数一个必须等于里面的行数B.行数一个必须等于里面的行数C.的列数B必须等于里面的列数C

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

名称-值参数

指定可选参数对为Name1 = Value1,…,以=家,在那里的名字参数名称和价值对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。

在R2021a之前,使用逗号分隔每个名称和值,并将其括起来的名字在报价。

例子:[D1,D2] = gucoder . batchedmatrixmultiplyadd (A1,B1,C1,A2,B2,C2,'alpha',0.3,'beta',0.6,'转置','CC');

用于与之相乘的标量的值一个.缺省值为1。

用于与之相乘的标量的值C.缺省值为1。

字符向量或由两个字符组成的字符串,表示对矩阵执行的操作一个而且B在矩阵乘法之前。可能值正常(“N”),转置(“T”),或复共轭转置(“C”).

输出参数

全部折叠

乘积,作为标量、向量或矩阵返回。数组D与输入的行数相同吗一个和输入的列数相同B

版本历史

R2020a中引入