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

Введенный в R2017b