exponenta event banner

gpucoder.batchedMatrixMultiplyAdd

Оптимизированная реализация GPU пакетной матрицы умножается на операцию добавления

Описание

[D1,D2] = gpucoder.batchedMatrixMultiplyAdd(A1,B1,C1,A2,B2,C2) выполняет матрично-матричное умножение и сложение пакета матриц A1,B1,C1 и A2,B2,C2. gpucoder.batchedMatrixMultiplyAdd функция выполняет матрично-матричное умножение вида:

D = αAB + βC

где α и β - коэффициенты скалярного умножения и A, B, C, и D - матрицы с размерами mоколо-k, kоколо-n, mоколо-n, и mоколо-n соответственно.A и B необязательно может быть транспонированным или эрмитово-сопряженным. По умолчанию α и β равны единице, и матрицы не транспонируются. Чтобы задать другой коэффициент скалярного умножения и выполнить операции транспонирования для входных матриц, используйте Name,Value аргументы пары.

Все пакеты, переданные в gpucoder.batchedMatrixMultiplyAdd функция должна быть однородной. То есть все экземпляры должны иметь одинаковые размеры m,n,k.

[D1,...,DN] = gpucoder.batchedMatrixMultiplyAdd(A1,B1,C1,...,AN,BN,CN) выполняет матрично-матричное умножение и сложение множественных A, B, C матрицы вида:

Di = αAiBi + βCi i = 1... N

пример

___ = gpucoder.batchedMatrixMultiplyAdd(___,Name,Value) выполняет пакетное умножение матрицы и операцию сложения с использованием опций, заданных одним или несколькими Name,Value аргументы пары.

Примеры

свернуть все

Выполнение простого пакетного умножения матрица-матрица с добавлением и использованием gpucoder.batchedMatrixMultiplyAdd функция для создания кода CUDA ®, который вызывает соответствующийcublas<t>gemmBatched API.

В одном файле запишите функцию точки входа myBatchMatMulAdd который принимает матричные входы A1, B1, C1, A2, B2, и C2. Поскольку входные матрицы не транспонируются, используйте 'nn' вариант.

function [D1,D2] = myBatchMatMulAdd(A1,B1,C1,A2,B2,C2,alpha,beta)

[D1,D2] = gpucoder.batchedMatrixMultiplyAdd(A1,B1,C1,A2,B2,C2, ...
    'alpha',alpha,,'beta',beta,'transpose','nn');

end

Чтобы создать тип для матрицы двойников для использования при создании кода, используйте coder.newtype функция.

A1 = coder.newtype('double',[12,14],[0 0]);
A2 = coder.newtype('double',[12,14],[0 0]);
B1 = coder.newtype('double',[14,16],[0 0]);
B2 = coder.newtype('double',[14,16],[0 0]);
C1 = coder.newtype('double',[12,16],[0 0]);
C2 = coder.newtype('double',[12,16],[0 0]);
alpha = 0.3;
beta = 0.6;
inputs = {A1,B1,C1,A2,B2,C2,alpha,beta};

Для создания библиотеки CUDA используйте codegen функция.

cfg = coder.gpuConfig('lib');
cfg.GpuConfig.EnableCUBLAS = true;
cfg.GpuConfig.EnableCUSOLVER = true;
cfg.GenerateReport = true;
codegen -config cfg-args inputs myBatchMatMulAdd

Созданный код CUDA содержит ядра myBatchMatMulAdd_kernelNN для инициализации входной и выходной матриц. Код также содержит cublasDgemmBatched Вызовы API в библиотеку cuBLAS. Следующий код является фрагментом созданного кода.

//
// File: 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], double alpha, double beta, double D1[192],
                      double D2[192])
{
  double alpha1;
...

  myBatchMatMulAdd_kernel2<<<dim3(1U, 1U, 1U), dim3(224U, 1U, 1U)>>>(*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<<<dim3(1U, 1U, 1U), dim3(192U, 1U, 1U)>>>(*gpu_C2,
    *gpu_C1, gpu_r3, gpu_r2);
  myBatchMatMulAdd_kernel4<<<dim3(1U, 1U, 1U), dim3(32U, 1U, 1U)>>>(gpu_r2,
    *gpu_out_cell);
  myBatchMatMulAdd_kernel5<<<dim3(1U, 1U, 1U), dim3(32U, 1U, 1U)>>>(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<<<dim3(1U, 1U, 1U), dim3(192U, 1U, 1U)>>>(*gpu_D2,
...

}

Входные аргументы

свернуть все

Операнды, указанные как векторы или матрицы. A, B, и C должны быть 2-D массивами. Количество столбцов в A должно быть равно количеству строк в B. Количество строк в A должно быть равно количеству строк в C. Количество столбцов в B должно быть равно количеству столбцов в C.

Типы данных: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
Поддержка комплексного номера: Да

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: [D1,D2] = gpucoder.batchedMatrixMultiplyAdd(A1,B1,C1,A2,B2,C2,'alpha',0.3,'beta',0.6,'transpose','CC');

Значение скаляра, используемого для умножения на A. Значение по умолчанию равно единице.

Значение скаляра, используемого для умножения на C. Значение по умолчанию равно единице.

Символьный вектор или строка, состоящая из двух символов, указывающая операцию, выполняемую с матрицами A и B до умножения матрицы. Возможные значения являются нормальными ('N'), транспонированный ('T'), или комплексное сопряженное транспонирование ('C').

Выходные аргументы

свернуть все

Произведение, возвращаемое как скаляр, вектор или матрица. Множество D имеет то же количество строк, что и входные A и то же количество столбцов, что и входные B.

Представлен в R2020a