推力的意外行为 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;
分别匹配keys1
和keys2
的类型。
如果你为你的仿函数类型使用模板,编译器就不会犯你犯过的这个错误。
我正在尝试使用按键排序对一组值进行排序。但是我使用的是两把钥匙而不是一把。这些值首先使用键 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;
分别匹配keys1
和keys2
的类型。
如果你为你的仿函数类型使用模板,编译器就不会犯你犯过的这个错误。