gpucoder.matrixMatrixKernel

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

Описание

пример

C = gpucoder.matrixMatrixKernel(FUN,A,B) генерирует ядра из функций, которые содержат GEMM-подобные операции. Для примера сопоставление функции точек между двумя изображениями с помощью:

  • Сумма абсолютных различий (SAD) - F() = @(a,b)abs(a-b)

  • Сумма квадратов различий (SSD) - F() = @(a,b)(a-b).*(a-b)

FUN является указателем на пользовательскую функцию. Из матрицы берутся одна строка и столбец A и одна строка и столбец из матрицы B и выводит вектор с тем же типом, что и вход. Затем выходной вектор суммируется, чтобы вычислить одно скалярное значение в C. Числовые входы A и B должен быть либо того же размера, либо иметь совместимые размеры. Для примера, если A является M-by- K матрица, B является K-by- N затем матрица C является M-by- N матрица.

C = gpucoder.matrixMatrixKernel(FUN,A,B,orientation) имеет необязательный аргумент orientation который задает ориентацию A и B матрицы. Это может занять одно из четырех возможных значений:

  • 'nn' - Матрицы A и B являются нормальными.

  • 'nt' - Матричная B транспонируется.

  • 'tn' - Матричная A транспонируется.

  • 'tt' - Обе матрицы A и B транспонируют.

Примеры

свернуть все

Этот пример выполняет умножение на простую матрицу и использует matrixMatrixKernel шаблон проекта для генерации CUDA® код.

В одном файле запишите функцию точки входа matMul_nn который принимает два матричных входов f1 и f2. Используйте MATLAB® функция @times для умножения f1 и f2 элемент за элементом. Знак @ создает указатель на функцию times. Вставьте gpucoder.matrixMatrixKernel() оператор. Матрицы входа не транспонируются, поэтому используйте 'nn' опция.

function scores = matMul_nn(f1, f2)
    scores = gpucoder.matrixMatrixKernel(@times, f1, f2, 'nn');
end

Используйте codegen функция для генерации функции MEX CUDA.

codegen -config coder.gpuConfig('mex') ...
    -args {ones(1024,1024,'double'),ones(1024,1024,'double')} ...
    -report matMul_nn

Сгенерированный код CUDA содержит два ядра: matMul_nn_kernel1 для инициализации выходной матрицы scores и matMul_nn_kernel2 который выполняет times операция. Ниже представлен фрагмент сгенерированного кода.

  matMul_nn_kernel1<<<dim3(2048U, 1U, 1U), dim3(512U, 1U, 1U)>>>(gpu_scores);
  cudaMemcpy(gpu_f2, f2, 8388608U, cudaMemcpyHostToDevice);
  cudaMemcpy(gpu_f1, f1, 8388608U, cudaMemcpyHostToDevice);
  matMul_nn_kernel2<<<dim3(16U, 16U, 1U), dim3(16U, 16U, 1U)>>>(gpu_f2, gpu_f1,
                   gpu_scores);
  cudaMemcpy(scores, gpu_scores, 8388608U, cudaMemcpyDeviceToHost);

matMul_nn_kernel2 Содержит 2-D сетку блоков 2-D. Ядро имеет 16x16 блоков с 256 потоками на блок.

Введенный в R2017b