gpucoder.batchedMatrixMultiplyAdd

Оптимизированная реализация графического процессора пакетных умножение матриц с, добавляет операция

Описание

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

D=αAB+βC

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

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

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

Di=αAiBi+βCii=1N

пример

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

Примеры

свернуть все

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

В одном файле запишите функции точки входа myBatchMatMulAdd это признает, что матрица вводит A1, B1C1 , 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};

Используйте codegen функция, чтобы сгенерировать библиотеку CUDA.

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,
...

}

Входные параметры

свернуть все

Операнды в виде векторов или матриц. AB, и C должны быть 2D массивы. Количество столбцов в 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