gpucoder.matrixMatrixKernel

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

Синтаксис

C = gpucoder.matrixMatrixKernel(FUN,A,B)
C = gpucoder.matrixMatrixKernel(FUN,A,B,orientation)

Описание

пример

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, который задает ориентацию матриц B и A. Это может принять одно из четырех возможных значений:

  • '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 имеет 2D сетку 2D блоков. Ядро имеет 16x16 блоки с 256 потоками на блок.

Введенный в R2017b