gpucoder.stridedMatrixMultiply

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

Описание

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

D=αAB

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

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

пример

___ = gpucoder.stridedMatrixMultiply(___,Name,Value) выполняет обработанный в пакетном режиме strided, умножение матриц операция с помощью опций, заданных одним или несколькими 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',[15,42],[0 0]);
B = coder.newtype('double',[42,30],[0 0]);
alpha = 0.3;
inputs = {A,B,alpha};

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

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[630], const double B[1260], double alpha,
                     double D[450])
{
  double alpha1;
...

  myStridedMatMul_kernel1<<<dim3(1U, 1U, 1U), dim3(480U, 1U, 1U)>>>(*gpu_D);
  beta1 = 0.0;
  cudaMemcpy(gpu_alpha1, &alpha1, 8UL, cudaMemcpyHostToDevice);
  cudaMemcpy(gpu_A, (void *)&A[0], 5040UL, cudaMemcpyHostToDevice);
  cudaMemcpy(gpu_B, (void *)&B[0], 10080UL, cudaMemcpyHostToDevice);
  cudaMemcpy(gpu_beta1, &beta1, 8UL, cudaMemcpyHostToDevice);
  cublasDgemmStridedBatched(getCublasGlobalHandle(), CUBLAS_OP_N, CUBLAS_OP_N,
    15, 30, 42, (double *)gpu_alpha1, (double *)&(*gpu_A)[0], 15, 0, (double *)
    &(*gpu_B)[0], 42, 0, (double *)gpu_beta1, (double *)&(*gpu_D)[0], 15, 450, 1);
  cudaMemcpy(&D[0], gpu_D, 3600UL, cudaMemcpyDeviceToHost);
...
}

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

свернуть все

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

Типы данных: 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