exponenta event banner

gpucoder.matrixMatrixKernel

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

Описание

пример

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около-K матрица, B является Kоколо-N матрица затем C является Mоколо-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 для создания функции CUDA MEX.

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