exponenta event banner

gpucoder.sort

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

Описание

пример

B = gpucoder.sort(A) сортирует элементы A в порядке возрастания. Операция сортировки выполняется на GPU с помощью библиотеки «Тяга». Trust представляет собой библиотеку шаблонов C++ для CUDA ® и поставляется с набором инструментов CUDA. Отсортированные выходные данные вB имеет тот же тип и размер, что и A. Если A является вектором, gpucoder.sort(A) сортирует элементы 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

Порядок сортировки стабилен. А именно, когда более чем один элемент имеет одинаковое значение, порядок равных элементов сохраняется в отсортированном выходе В, и индексы I, относящиеся к равным элементам, возрастают.

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

Примеры

свернуть все

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

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

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

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

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