неожиданное поведение для тяги sort_by_key - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь использовать сортировку по ключу для сортировки набора значений.Однако я использую две клавиши вместо одной.Значения сначала сортируются с использованием ключа 1, а затем ключа 2.key1 - это int, а key2 - это число с плавающей запятой.

Мои входные данные, ожидаемые выходные данные, фактические выходные данные и мой код приведены ниже.Сортировка не , кажется, работала правильно для второй клавиши , что видно из разницы фактического и ожидаемого результата в первых двух строках.

INPUT:

keys1, keys2, значения:

1,  0.3,    1
3,  5.1,    5
3,  3.2,    3
3,  -0.08,  8
2,  2.1,    2
2,  5.2,    8
2,  1.1,    1
1,  -0.01,  1

Мой ожидаемый результат -

keys1, keys2, значения:

1,  -0.01,  1
1,  0.3,    1
2,  1.1,    1
2,  2.1,    2
2,  5.2,    8
3, -0.08,   8
3,  3.2,    3
3,  5.1,    5

Фактический вывод:

keys1, keys2, значения:

1,  0.3,    1
1,  -0.01,  1
2,  1.1,    1
2,  2.1,    2
2,  5.2,    8
3,  -0.08   8
3,  3.2,    3
3,  5.1,    5

Мой код:

#include <thrust/device_vector.h>
#include <thrust/sort.h>
#include <thrust/execution_policy.h>

typedef thrust::tuple<int, int> Tuple;

/**************************/
/* TUPLE ORDERING FUNCTOR */
/**************************/
struct TupleComp
{
    __host__ __device__ bool operator()(const Tuple& t1, const Tuple& t2)
    {
        if (t1.get<0>() < t2.get<0>())
            return true;
        if (t1.get<0>() > t2.get<0>())
            return false;
        return t1.get<1>() < t2.get<1>();
    }
};

/********/
/* MAIN */
/********/
int main()
{
    const int N = 8;

    // --- Keys and values on the host: allocation and definition

        thrust::device_vector<int> keys1(N);
        thrust::device_vector<int> values(N);
        thrust::device_vector<float> keys2(N);

        keys1[0] = 1; keys1[1] = 3; keys1[2] = 3; keys1[3] = 3; 
        keys1[4] = 2; keys1[5] = 2; keys1[6] = 2; keys1[7] = 1; 


        values[0] = 1; values[1] = 5; values[2] = 3; values[3] = 8; 
        values[4] = 2; values[5] = 8; values[6] = 1; values[7] = 1; 

        keys2[0] = 0.3; keys2[1] = 5.1; keys2[2] = 3.2; keys2[3] = -0.08; 
        keys2[4] = 2.1; keys2[5] = 5.2; keys2[6] = 1.1; keys2[7] = -0.01; 


    std::cout << "ORIGINAL:"<< std::endl;
    std::cout << "keys1, keys2, values:" << std::endl;
    for (int i = 0; i < N; i++) {
        std::cout << keys1[i] <<'\t' << keys2[i] << '\t' << values[i] << std::endl;
    }


    thrust::sort_by_key(thrust::device, thrust::make_zip_iterator(thrust::make_tuple(keys1.begin(), keys2.begin())),
                            thrust::make_zip_iterator(thrust::make_tuple(keys1.begin() + N, keys2.begin() + N)), 
                            values.begin(), TupleComp());

    std::cout <<std::endl;

    std::cout << "ORDERED:"<< std::endl;
    std::cout << "keys1, keys2, values:" << std::endl;
    for (int i = 0; i < N; i++) {
        std::cout << keys1[i] <<'\t' << keys2[i] << '\t' << values[i] << std::endl;

    }

}

1 Ответ

0 голосов
/ 01 февраля 2019

Вы неверно определили тип кортежа:

typedef thrust::tuple<int, int> Tuple;

. Это должно быть:

typedef thrust::tuple<int, float> Tuple;

, чтобы соответствовать типам keys1 и keys2 соответственно.

Если вы используете шаблоны для типов функторов, компилятор не допустит этой ошибки.

...