exponenta event banner

gpucoder.stridedMatrixMultiplyAdd

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

Описание

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

D=αAB+βC

где α и β являются скалярными коэффициентами умножения, A, B, C, и D являются матрицами с размерностями m-by- k, k-by- n, m-by- n, и m-by- 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