Как сортировать ключи с меньшей точностью с помощью библиотеки Thrust

У меня есть набор целочисленных значений, и я хочу отсортировать их с помощью Thrust. Есть ли возможность использовать только некоторые старшие / младшие биты в этой сортировке. Если возможно, я не хочу использовать пользовательский компаратор, потому что он меняет используемый алгоритм с радикальной сортировки на сортировку слиянием и значительно увеличивает истекшее время.

Я думаю, что когда все числа имеют одно и то же значение в бите, этот бит пропускается при сортировке, поэтому возможно ли использовать наименьшее возможное число бит и надеюсь, что этого будет достаточно. (то есть: для 5 бит, используя char с 8 битами и устанавливая верхние 3 бита в 0)

Пример:

sort<4, 0>(myvector.begin(), myvector.end())
sort<4, 1>(myvector.begin(), myvector.end())

сортировка, используя только 4 бита, высокий или низкий.

Нечто похожее на http://www.moderngpu.com/sort/mgpusort.html

2 ответа

Решение

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

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

Как насчет использования transformer_iterator? Вот краткий пример (сортировка по первым битам), и вы можете написать собственную унарную функцию для ваших целей.

#include <iostream>
#include <thrust/device_vector.h>
#include <thrust/iterator/transform_iterator.h>
#include <thrust/sort.h>

using namespace std;
struct and_func : public thrust::unary_function<int,int>
{
    __host__ __device__
        int operator()(int x)
        {
            return 8&x;
        }
};
int main()
{
    thrust::device_vector<int> d_vec(4);
    d_vec[0] = 10;
    d_vec[1] = 8;
    d_vec[2] = 12;
    d_vec[3] = 1;
    thrust::sort_by_key(thrust::make_transform_iterator(d_vec.begin(), and_func()),
                 thrust::make_transform_iterator(d_vec.end(), and_func()),
                 d_vec.begin());
    for (int i = 0; i < 4; i++)
        cout<<d_vec[i]<<" ";
    cout<<"\n"<<endl;
    return 0;
}
Другие вопросы по тегам