exponenta event banner

gpucoder.batchedMatrixMultiply

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

Описание

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

D = αАВ

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

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

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

Di = αAiBi i = 1... N

пример

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

Примеры

свернуть все

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

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

function [D1,D2] = myBatchMatMul(A1,B1,A2,B2,alpha)

[D1,D2] = gpucoder.batchedMatrixMultiply(A1,B1,A2,B2, ...
    'alpha',alpha,'transpose','nn');

end

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

A1 = coder.newtype('double',[15,42],[0 0]);
A2 = coder.newtype('double',[15,42],[0 0]);
B1 = coder.newtype('double',[42,30],[0 0]);
B2 = coder.newtype('double',[42,30],[0 0]);
alpha = 0.3;
inputs = {A1,B1,A2,B2,alpha};

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

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

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

//
// File: myBatchMatMul.cu
//
...
void myBatchMatMul(const double A1[630], const double B1[1260], const double A2
                   [630], const double B2[1260], double alpha, double D1[450],
                   double D2[450])
{
  double alpha1;
...

  myBatchMatMul_kernel1<<<dim3(2U, 1U, 1U), dim3(512U, 1U, 1U)>>>(*gpu_A2,
    *gpu_A1, *gpu_input_cell_f2, *gpu_input_cell_f1);
  cudaMemcpy(gpu_B2, (void *)&B2[0], 10080UL, cudaMemcpyHostToDevice);
  cudaMemcpy(gpu_B1, (void *)&B1[0], 10080UL, cudaMemcpyHostToDevice);
  myBatchMatMul_kernel2<<<dim3(3U, 1U, 1U), dim3(512U, 1U, 1U)>>>(*gpu_B2,
    *gpu_B1, *gpu_input_cell_f4, *gpu_input_cell_f3);
  myBatchMatMul_kernel3<<<dim3(1U, 1U, 1U), dim3(480U, 1U, 1U)>>>(gpu_r3, gpu_r2);
  myBatchMatMul_kernel4<<<dim3(1U, 1U, 1U), dim3(32U, 1U, 1U)>>>(gpu_r2,
    *gpu_out_cell);
  myBatchMatMul_kernel5<<<dim3(1U, 1U, 1U), dim3(32U, 1U, 1U)>>>(gpu_r3,
    *gpu_out_cell);
...

  cublasDgemmBatched(getCublasGlobalHandle(), CUBLAS_OP_N, CUBLAS_OP_N, 15, 30,
                     42, (double *)gpu_alpha1, (double **)gpu_Aarray, 15,
                     (double **)gpu_Barray, 42, (double *)gpu_beta1, (double **)
                     gpu_Carray, 15, 2);
  myBatchMatMul_kernel6<<<dim3(1U, 1U, 1U), dim3(480U, 1U, 1U)>>>(*gpu_D2,
    *gpu_out_cell, *gpu_D1);
...
}

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

свернуть все

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

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

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

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

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

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

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

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

свернуть все

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

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