gpucoder.stridedMatrixMultiply

Оптимизированная реализация GPU операции штрихового и пакетного матричного умножения

Описание

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

D=αAB

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

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

пример

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

Примеры

свернуть все

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

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

function [D] = myStridedMatMul(A,B,alpha)

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

end

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

A = coder.newtype('double',[5 4 100],[0 0]);
B = coder.newtype('double',[4 5 100],[0 0]);
alpha = 0.3;
inputs = {A,B,alpha};

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

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

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

//
// File: myStridedMatMul.cu
//
...
void myStridedMatMul(const double A_data[], const int A_size[3], const double
                     B_data[], const int B_size[3], double alpha, double D_data[],
                     int D_size[3])
{
  double alpha1;
...
  beta1 = 0.0;
  cudaMemcpy(gpu_alpha1, &alpha1, 8ULL, cudaMemcpyHostToDevice);
  cudaMemcpy(gpu_A_data, (void *)A_data, A_size[0] * A_size[1] * A_size[2] *
             sizeof(double), cudaMemcpyHostToDevice);
  cudaMemcpy(gpu_B_data, (void *)B_data, B_size[0] * B_size[1] * B_size[2] *
             sizeof(double), cudaMemcpyHostToDevice);
  cudaMemcpy(gpu_beta1, &beta1, 8ULL, cudaMemcpyHostToDevice);
  if (D_data_dirtyOnCpu) {
    cudaMemcpy(gpu_D_data, &D_data[0], 25 * D_size[2] * sizeof(double),
               cudaMemcpyHostToDevice);
  }

  if (batchDimsA[2] >= batchDimsB[2]) {
    if (batchDimsA[2] >= 1) {
      ntilecols = batchDimsA[2];
    } else {
      ntilecols = 1;
    }
  } else {
    ntilecols = batchDimsB[2];
  }

  cublasDgemmStridedBatched(getCublasGlobalHandle(), CUBLAS_OP_N, CUBLAS_OP_N, 5,
    5, 4, (double *)gpu_alpha1, (double *)&gpu_A_data[0], 5, strideA, (double *)
    &gpu_B_data[0], 4, strideB, (double *)gpu_beta1, (double *)&gpu_D_data[0], 5,
    25, ntilecols);
  cudaMemcpy(&D_data[0], gpu_D_data, 25 * D_size[2] * sizeof(double),
             cudaMemcpyDeviceToHost);
...
}

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

свернуть все

Операнды, заданные как векторы или матрицы. gpucoder.stridedMatrixMultiply умножается по первым двум размерностям.

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

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

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

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

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

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

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

свернуть все

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

Введенный в R2020a