Sorting 按\u键进行推力排序\u的意外行为

Sorting 按\u键进行推力排序\u的意外行为,sorting,cuda,tuples,key,thrust,Sorting,Cuda,Tuples,Key,Thrust,我尝试使用“按键排序”对一组值进行排序。但是我用的是两把钥匙,而不是一把。首先使用键1和键2对值进行排序。键1是int,键2是float 我的输入、预期输出、实际输出和代码如下。 排序对于第二个键似乎没有正常工作,这从前两行的实际输出和预期输出的差异中可以明显看出。 输入: 键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, -

我尝试使用“按键排序”对一组值进行排序。但是我用的是两把钥匙,而不是一把。首先使用键1和键2对值进行排序。键1是int,键2是float

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

输入:

键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,  -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,  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
我的预期产出是

键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,  -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,  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
实际输出为:

键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,  -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,  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-tuple;
/**************************/
/*元组排序函子*/
/**************************/
结构元组
{
__主机\设备\布尔运算符()(常量元组和t1、常量元组和t2)
{
if(t1.get()t2.get())
返回false;
返回t1.get()std::cout您错误地定义了元组类型:

typedef thrust::tuple<int, int> Tuple;
typedef推力::元组元组;
应该是:

typedef thrust::tuple<int, float> Tuple;
typedef推力::元组元组;
分别匹配
键1
键2
的类型


如果对函子类型使用模板,编译器将不会犯您所犯的错误。

您的元组类型定义不正确:

typedef thrust::tuple<int, int> Tuple;
typedef推力::元组元组;
应该是:

typedef thrust::tuple<int, float> Tuple;
typedef推力::元组元组;
分别匹配
键1
键2
的类型

如果对函子类型使用模板,编译器将不会犯您所犯的错误