gpucoder.sort

Оптимизированная реализация GPU функции сортировки MATLAB

Описание

пример

B = gpucoder.sort(A) сортирует элементы A в порядке возрастания. Операция сортировки выполняется на графическом процессоре с помощью библиотеки Thrust. Тяга является библиотекой шаблонов C++ для CUDA® и поставляется с комплектом инструментальных средств CUDA. Отсортированный выход в B имеет тот же тип и размер, что и A. Если A является вектором, gpucoder.sort(A) сортирует элементы массива в порядке возрастания. Если A является матрицей, gpucoder.sort(A) сортирует каждый столбец A в порядке возрастания. Если A является N-мерным массивом, gpucoder.sort(A) сортирует по первой не синглтонной размерности.

B = gpucoder.sort(A,dim) имеет необязательный аргумент dim который задает размерность, по которому выполняется операция сортировки.

B = gpucoder.sort(A,direction) имеет необязательный аргумент direction который задает направление сортировки. direction может принимать одно из двух значений:

  • 'ascend' - Сортировки в порядке возрастания. Это опция по умолчанию

  • 'descend' - Сортировки в порядке убывания.

[B,I] = gpucoder.sort(A,...) возвращает индекс сортировки I который задает, как элементы A были перестроены, чтобы получить отсортированный выход B.

  • Если A является вектором, тогда B = A(I).

  • Если A является матрицей m на n и dim = 1, затем

    for j = 1:n
      B(:,j) = A(I(:,j),j);
    end

Сортировочное упорядоченное расположение стабильно. А именно, когда больше чем один элемент имеет одно и то же значение, порядок равных элементов сохраняется в отсортированном выходе B, и индексы I, относящиеся к равным элементам, возрастают.

Когда gpucoder.sort вызывается из MATLAB®, он использует встроенный sort функция.

Примеры

свернуть все

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

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

function B = mySort(A)
     B = gpucoder.sort(A, 1, 'descend');
end

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

codegen -config coder.gpuConfig('mex') -args {ones(1024,1024,'double')} -report mySort

Ниже представлен фрагмент сгенерированного кода. Вызов библиотеки тяги обозначается thrustSortImpl

...
cudaMalloc(&gpu_inDims, 8ULL);
cudaMalloc(&gpu_B, 8388608ULL);
cudaMalloc(&gpu_A, 8388608ULL);
mySort_kernel1<<<dim3(1U, 1U, 1U), dim3(32U, 1U, 1U)>>>(*gpu_inDims);
cudaMemcpy(gpu_A, (void *)&A[0], 8388608ULL, cudaMemcpyHostToDevice);
mySort_kernel2<<<dim3(2048U, 1U, 1U), dim3(512U, 1U, 1U)>>>(*gpu_A, *gpu_B);
cudaMemcpy(&inDims[0], gpu_inDims, 8ULL, cudaMemcpyDeviceToHost);
thrustSortImpl(&(*gpu_B)[0], 2, &inDims[0], 1, 'd', false);
cudaMemcpy(&B[0], gpu_B, 8388608ULL, cudaMemcpyDeviceToHost);
...

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

свернуть все

Входной массив, заданный как векторный, матричный или многомерный массив.

Типы данных: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char

Размерность для работы, заданная как положительный целочисленный скаляр Если значение не задано, то по умолчанию это первое измерение массива, не равный 1.

sort возвращает A если dim больше ndims(A). dim не поддерживается, когда A - массив ячеек, то есть sort действует только вдоль первого измерения массива, размер которого не равен 1.

Типы данных: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Направление сортировки, заданное как 'ascend' или 'descend'. direction не поддерживается, когда A - массив ячеек, то есть sort сортирует только в порядке возрастания.

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

свернуть все

Отсортированный массив, возвращенный как векторный, матричный или многомерный массив. B - тот же размер и тип, что и A. Порядок элементов в B сохраняет порядок любых равных элементов в A.

Типы данных: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char

Сортировка индекса, возвращенная как вектор, матрица или многомерный массив. I - тот же размер, что и A. Векторы индекса ориентированы вдоль той же размерности, что и sort действует на. Для примера, если A - матрица 2 на 3, затем [B,I] = sort(A,2) сортирует элементы в каждой строке A. Область выхода I - набор векторов индекса строками 1 на 3, описывающих перестройку каждой строки A.

Ограничения

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

  • gpucoder.sort не поддерживает 'MissingPlacement' и 'ComparisonMethod' Пары "имя-значение", поддерживаемая MATLAB sort функция.

Введенный в R2018b