gpucoder.reduce

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

Описание

пример

S = gpucoder.reduce(A,FUN) агрегирует значения, существующие в массиве входа A к одному значению с помощью данного указателя на функцию FUN. Область выхода S является скаляром.

S = gpucoder.reduce(A,{@FUN1,@FUN2,...}) принимает массив входа и cell-массива указателей на функцию. Он агрегирует значения, существующие в массиве входа, в одно значение для каждого указателя на функцию, предоставленного в массиве ячеек. Размер выхода 1-by-N, где N - количество указателей на функцию.

Генератор кода использует shuffle признаки для выполнения эффективного сокращения на графическом процессоре. Несколько указатели на функцию агрегируются внутри одного ядра на графическом процессоре.

Примеры

свернуть все

Этот пример генерирует CUDA® код для поиска суммы и максимума элементов массива.

В одном файле запишите функцию точки входа multireduce который принимает матричный вход A. Используйте gpucoder.reduce функция для выполнения двух типов операций сокращения на элементах A.

function s = multireduce(A)
  s = gpucoder.reduce(A, {@mysum, @mymax}); 
end

function c = mysum(a, b)
  c = a+b;
end

function c = mymax(a, b)
  c = max(a,b);
end

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

codegen -config coder.gpuConfig('mex') -args {rand(1,1024,'double')} -report multireduce

Ниже представлен фрагмент сгенерированного кода.

...
cudaMalloc(&gpu_s, 16ULL);
cudaMalloc(&gpu_A, 8192ULL);
cudaMemcpy(gpu_A, (void *)&A[0], 8192ULL, cudaMemcpyHostToDevice);
multireduce_kernel1<<<dim3(1U, 1U, 1U), dim3(32U, 1U, 1U)>>>(*gpu_A, *gpu_s);
coder_reduce0<<<dim3(2U, 1U, 1U), dim3(512U, 1U, 1U)>>>(*gpu_A, *gpu_s);
cudaMemcpy(&s[0], gpu_s, 16ULL, cudaMemcpyDeviceToHost);
...
static __inline__ __device__ real_T shflDown2(real_T in1, uint32_T offset,
  uint32_T mask)
{
  int2 tmp;
  tmp = *(int2 *)&in1;
  tmp.x = __shfl_down_sync(mask, tmp.x, offset);
  tmp.y = __shfl_down_sync(mask, tmp.y, offset);
  return *(real_T *)&tmp;
}
...

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

свернуть все

Массив входа для выполнения операции сокращения. Для генерации кода массив входа должен быть числового или логического типа данных.

Указатель на пользовательскую функцию. FUN может также быть cell-массивом указателей на функцию. Указатель на функцию является двоичной функцией и должен удовлетворять следующим требованиям:

  • Примите два входа и возвращает один выход. Тип входов и выход функции должен совпадать с типом входного массива A.

  • Функция должна быть коммутативной и ассоциативной, в противном случае поведение не определено.

Выходные аргументы

свернуть все

Результат операции сокращения. Во время сокращения, S инициализируется в значение одного из элементов массива входа A. Затем операцию восстановления выполняют путем применения FUN каждому элементу в A и S.

Ограничения

  • gpucoder.reduce не поддерживает входные массивы комплексных данных.

  • Определяемая пользователем функция должна принять два входов и вернуть один выход. Тип входов и выход функции должен совпадать с типом входного массива A.

  • Определяемая пользователем функция должна быть коммутативной и ассоциативной, в противном случае поведение не определено.

  • Для некоторых входов целочисленного типа данных сгенерированный код может содержать промежуточные расчеты, которые достигают насыщения. В таких случаях результаты из сгенерированного кода могут не совпадать с результатами симуляции от MATLAB®.

Введенный в R2019b