gpucoder.reduce

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

Описание

пример

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

S = gpucoder.reduce(A,{@FUN1,@FUN2,...}) принимает входной массив и cell-массив указателей на функцию. Это агрегировало значения, существующие во входном массиве к одному значению для каждого указателя на функцию, обеспеченного в массиве ячеек. Размер выхода 1 на 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.

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

Аргументы name-value

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: gpucoder.reduce(A, {@mySum, @myMax},'dim',2);

Выполните сокращение в заданном измерении

Пример: gpucoder.reduce(A, {@mySum, @myMax},'dim',2);

Примените функцию предварительной обработки к элементам входного массива прежде, чем выполнить операцию сокращения.

Пример: gpucoder.reduce(A,@mySum,'preprocess',@myScale);

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

свернуть все

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

Ограничения

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

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

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

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

Введенный в R2019b