主要内容

gpucoder.stridedMatrixMultiply

优化的GPU实现向和批处理矩阵乘运算

自从R2020a

描述

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

D = α 一个 B

在哪里 α 是一个标量乘法因子,一个,B,D与维矩阵——- - - - - -k,k——- - - - - -n,——- - - - - -n分别。你可以选择或厄米共轭转置一个B。默认情况下, α 将一个矩阵转置。指定一个不同的标量乘法因子和执行对输入矩阵转置操作,使用名称,值对参数。

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

例子

___= gpucoder.stridedMatrixMultiply (___,名称,值)执行向批处理矩阵相乘操作通过使用一个或多个指定的选项名称,值对参数。

例子

全部折叠

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

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

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

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

一个= coder.newtype (“双”(100 4),[0 0]);B = coder.newtype (“双”,[4 5 100],[0 0]);α= 0.3;输入= {A, B,α};

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

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

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

/ / / /文件:myStridedMatMul。铜/ /……空白myStridedMatMul (const双A_data [], const int A_size [3], const双B_data [], const int B_size[3],双α,双D_data [], int D_size[3]){双α1;…beta1 = 0.0;cudaMemcpy (gpu_alpha1α1 8妳cudaMemcpyHostToDevice);cudaMemcpy (gpu_A_data (void *) A_data A_size [0] * A_size * A_size [1] [2] * sizeof(双),cudaMemcpyHostToDevice);cudaMemcpy (gpu_B_data (void *) B_data B_size [0] * B_size * B_size [1] [2] * sizeof(双),cudaMemcpyHostToDevice);cudaMemcpy (gpu_beta1 beta1 8妳cudaMemcpyHostToDevice);如果(D_data_dirtyOnCpu) {cudaMemcpy (gpu_D_data &D_data [0], 25 * D_size [2] * sizeof(双),cudaMemcpyHostToDevice);}如果(batchDimsA [2] > = batchDimsB[2]){如果(batchDimsA [2] > = 1) {ntilecols = batchDimsA [2]; } else { ntilecols = 1; } } else { ntilecols = batchDimsB[2]; } cublasDgemmStridedBatched(getCublasGlobalHandle(), CUBLAS_OP_N, CUBLAS_OP_N, 5, 5, 4, (double *)gpu_alpha1, (double *)&gpu_A_data[0], 5, strideA, (double *) &gpu_B_data[0], 4, strideB, (double *)gpu_beta1, (double *)&gpu_D_data[0], 5, 25, ntilecols); cudaMemcpy(&D_data[0], gpu_D_data, 25 * D_size[2] * sizeof(double), cudaMemcpyDeviceToHost); ... }

输入参数

全部折叠

操作数,指定为向量或矩阵。gpucoder.stridedMatrixMultiply繁殖前两个维度。

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

名称-值参数

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

R2021a之前,用逗号来分隔每一个名称和值,并附上的名字在报价。

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

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

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

输出参数

全部折叠

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

版本历史

介绍了R2020a