推力的意外行为 sort_by_key

unexpected behavior for thrust sort_by_key

我正在尝试使用按键排序对一组值进行排序。但是我使用的是两把钥匙而不是一把。这些值首先使用键 1 排序,然后使用键 2 排序。 key1 是一个整数,key2 是一个浮点数。

我的输入、预期输出、实际输出和我的代码如下。 排序 似乎对 第二个键 正常工作,从实际输出和预期输出 中的差异可以明显看出前两行。

输入:

键 1、键 2、值:

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

我的预期输出是

键 1、键 2、值:

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

实际输出为:

键 1、键 2、值:

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;

    }

}

您错误地定义了元组类型:

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

应该是:

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

分别匹配keys1keys2的类型。

如果你为你的仿函数类型使用模板,编译器就不会犯你犯过的这个错误。