exponenta event banner

gpucoder.stridedMatrixMultiplyAdd

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

Описание

D = gpucoder.stridedMatrixMultiplyAdd(A,B,C) выполняет пошаговое матрично-матричное умножение и сложение партии матриц. Входные матрицы A, B, и C для каждого экземпляра пакета расположены в фиксированных смещениях адресов от их адресов в предыдущем экземпляре. gpucoder.stridedMatrixMultiplyAdd функция выполняет матрично-матричное умножение вида:

D = αAB + βC

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

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

пример

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

Примеры

свернуть все

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

В одном файле запишите функцию точки входа myStridedMatMulAdd который принимает матричные входы A, B, и C. Поскольку входные матрицы не транспонируются, используйте 'nn' вариант.

function [D] = myStridedMatMulAdd(A,B,C,alpha,beta)

[D] = gpucoder.stridedMatrixMultiplyAdd(A,B,C,'alpha',alpha,...
    'beta',beta,'transpose','nn');

end

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

A = coder.newtype('double',[12,14 10],[0 0]);
B = coder.newtype('double',[14,16 10],[0 0]);
C = coder.newtype('double',[12,16 10],[0 0]);
alpha = 0.3;
beta = 0.6;
inputs = {A,B,C,alpha,beta};

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

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

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

//
// File: myStridedMatMulAdd.cu
...

void myStridedMatMulAdd(const double A[1680], const double B[2240], const double
  C[1920], double alpha, double beta, double D[1920])
{
  double alpha1;

..alpha1 = alpha;
  beta1 = beta;
  cudaMemcpy(gpu_C, (void *)&C[0], 15360ULL, cudaMemcpyHostToDevice);
  myStridedMatMulAdd_kernel1<<<dim3(4U, 1U, 1U), dim3(512U, 1U, 1U)>>>(*gpu_C,
    *gpu_D);
  cudaMemcpy(gpu_alpha1, &alpha1, 8ULL, cudaMemcpyHostToDevice);
  cudaMemcpy(gpu_A, (void *)&A[0], 13440ULL, cudaMemcpyHostToDevice);
  cudaMemcpy(gpu_B, (void *)&B[0], 17920ULL, cudaMemcpyHostToDevice);
  cudaMemcpy(gpu_beta1, &beta1, 8ULL, cudaMemcpyHostToDevice);
  cublasDgemmStridedBatched(getCublasGlobalHandle(), CUBLAS_OP_N, CUBLAS_OP_N,
    12, 16, 14, (double *)gpu_alpha1, (double *)&(*gpu_A)[0], 12, 168, (double *)
    &(*gpu_B)[0], 14, 224, (double *)gpu_beta1, (double *)&(*gpu_D)[0], 12, 192,
    10);
  cudaMemcpy(&D[0], gpu_D, 15360ULL, cudaMemcpyDeviceToHost);
...
}

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

свернуть все

Операнды, указанные как векторы или матрицы. Количество столбцов в 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.

Пример: D = gpucoder.stridedMatrixMultiplyAdd(A,B,C,'alpha',0.3,'beta',0.6,'transpose','CC');

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

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

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

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

свернуть все

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

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