C++ 使用平铺区域按按键进行推力排序-不重新排序
我在cuda和键中使用带有排序键()的平铺键范围 在按键排序期间不会重新排序,只会重新排序值 例如:我有一个表示键的向量:C++ 使用平铺区域按按键进行推力排序-不重新排序,c++,sorting,cuda,thrust,C++,Sorting,Cuda,Thrust,我在cuda和键中使用带有排序键()的平铺键范围 在按键排序期间不会重新排序,只会重新排序值 例如:我有一个表示键的向量: Keys 0 1 2 3 4 5 稍后,对于平铺的_范围,我有了一个新的向量,它的值是重复的 Keys 0 1 2 3 4 5 0 1 2 3 4 5 和另一个表示值的向量: values 0 3382 1863 470 311 2017 3382 0 2
Keys 0 1 2 3 4 5
稍后,对于平铺的_范围,我有了一个新的向量,它的值是重复的
Keys 0 1 2 3 4 5 0 1 2 3 4 5
和另一个表示值的向量:
values 0 3382 1863 470 311 2017 3382 0 251 1394 5651 257
我希望使用sort_by_键重新排序键,如下所示:
Keys 0 0 1 1 2 2 3 3 4 4 5 5
Values 0 3382 3382 0 1863 251 470 1394 311 5651 2017 257
我的代码以这种方式重新排序键
Keys 3 3 4 4 5 5 3 3 4 4 5 5
Values 0 3382 3382 0 1863 251 470 1394 311 5651 2017 257
我想知道,以这种方式重新订购的原因可能是什么,我能做些什么来获得正确的订单
代码如下:
#include <iterator>
#include <thrust/device_vector.h>
#include <thrust/host_vector.h>
#include <thrust/sort.h>
using namespace thrust::placeholders;
template<typename Iterator>
class tiled_range
//Code of tiled_range....
//
int main(void)
{
thrust::device_vector<int> data(6);
data[0] = 0; data[1] = 1; data[2] = 2; data[3] = 3; data[4] = 4; data[5] = 5;
thrust::device_vector<float> values(12);
values[0] = 0; values[6] = 3382;
values[1] = 3382; values[7] = 0;
values[2] = 1863; values[8] = 251;
values[3] = 470; values[9] = 1394;
values[4] = 311; values[10] = 5651;
values[5] = 2017; values[11] = 257;
tiled_range<thrust::device_vector<int>::iterator> keys(data.begin(), data.end(), 2);
std::cout << "Keys: " << std::endl;
thrust::copy(keys.begin(), keys.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
thrust::sort_by_key(keys.begin(), keys.end(), values.begin());
std::cout << "Keys: " << std::endl;
thrust::copy(keys.begin(), keys.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::cout << "Values: " << std::endl;
thrust::copy(values.begin(), values.end(), std::ostream_iterator<int> (std::cout, " "));
std::cout << std::endl;
return 0;
#include <iterator>
#include <thrust/device_vector.h>
#include <thrust/host_vector.h>
#include <thrust/sort.h>
using namespace thrust::placeholders;
template<typename Iterator>
class tiled_range
//Code of tiled_range....
//
int main(void)
{
thrust::device_vector<int> data(6);
data[0] = 0; data[1] = 1; data[2] = 2; data[3] = 3; data[4] = 4; data[5] = 5;
thrust::device_vector<float> values(12);
values[0] = 0; values[6] = 3382;
values[1] = 3382; values[7] = 0;
values[2] = 1863; values[8] = 251;
values[3] = 470; values[9] = 1394;
values[4] = 311; values[10] = 5651;
values[5] = 2017; values[11] = 257;
tiled_range<thrust::device_vector<int>::iterator> keys(data.begin(), data.end(), 2);
thrust::device_vector<int> keysN(keys.begin(), keys.end());
std::cout << "Keys: " << std::endl;
thrust::copy(keysN.begin(), keysN.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
thrust::sort_by_key(keysN.begin(), keysN.end(), values.begin());
std::cout << "Keys: " << std::endl;
thrust::copy(keys.begin(), keys.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::cout << "Values: " << std::endl;
thrust::copy(values.begin(), values.end(), std::ostream_iterator<int> (std::cout, " "));
std::cout << std::endl;
return 0;
}
#包括
#包括
#包括
#包括
使用命名空间推力::占位符;
模板
类平铺范围
//平铺区域的代码。。。。
//
内部主(空)
{
推力:设备_矢量数据(6);
数据[0]=0;数据[1]=1;数据[2]=2;数据[3]=3;数据[4]=4;数据[5]=5;
推力:装置_矢量值(12);
值[0]=0;值[6]=3382;
值[1]=3382;值[7]=0;
数值[2]=1863;数值[8]=251;
数值[3]=470;数值[9]=1394;
数值[4]=311;数值[10]=5651;
数值[5]=2017;数值[11]=257;
平铺的_范围键(data.begin(),data.end(),2);
问题解决了!我正在检查以下代码:
我注意到他们将平铺区域的值复制到另一个向量中,在复制这个新向量并将其放入按键排序后,它对键和值进行了完美的排序。我仍然不明白为什么将平铺区域的迭代器作为按键排序的输入会造成上面的混乱
代码如下:
#include <iterator>
#include <thrust/device_vector.h>
#include <thrust/host_vector.h>
#include <thrust/sort.h>
using namespace thrust::placeholders;
template<typename Iterator>
class tiled_range
//Code of tiled_range....
//
int main(void)
{
thrust::device_vector<int> data(6);
data[0] = 0; data[1] = 1; data[2] = 2; data[3] = 3; data[4] = 4; data[5] = 5;
thrust::device_vector<float> values(12);
values[0] = 0; values[6] = 3382;
values[1] = 3382; values[7] = 0;
values[2] = 1863; values[8] = 251;
values[3] = 470; values[9] = 1394;
values[4] = 311; values[10] = 5651;
values[5] = 2017; values[11] = 257;
tiled_range<thrust::device_vector<int>::iterator> keys(data.begin(), data.end(), 2);
std::cout << "Keys: " << std::endl;
thrust::copy(keys.begin(), keys.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
thrust::sort_by_key(keys.begin(), keys.end(), values.begin());
std::cout << "Keys: " << std::endl;
thrust::copy(keys.begin(), keys.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::cout << "Values: " << std::endl;
thrust::copy(values.begin(), values.end(), std::ostream_iterator<int> (std::cout, " "));
std::cout << std::endl;
return 0;
#include <iterator>
#include <thrust/device_vector.h>
#include <thrust/host_vector.h>
#include <thrust/sort.h>
using namespace thrust::placeholders;
template<typename Iterator>
class tiled_range
//Code of tiled_range....
//
int main(void)
{
thrust::device_vector<int> data(6);
data[0] = 0; data[1] = 1; data[2] = 2; data[3] = 3; data[4] = 4; data[5] = 5;
thrust::device_vector<float> values(12);
values[0] = 0; values[6] = 3382;
values[1] = 3382; values[7] = 0;
values[2] = 1863; values[8] = 251;
values[3] = 470; values[9] = 1394;
values[4] = 311; values[10] = 5651;
values[5] = 2017; values[11] = 257;
tiled_range<thrust::device_vector<int>::iterator> keys(data.begin(), data.end(), 2);
thrust::device_vector<int> keysN(keys.begin(), keys.end());
std::cout << "Keys: " << std::endl;
thrust::copy(keysN.begin(), keysN.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
thrust::sort_by_key(keysN.begin(), keysN.end(), values.begin());
std::cout << "Keys: " << std::endl;
thrust::copy(keys.begin(), keys.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::cout << "Values: " << std::endl;
thrust::copy(values.begin(), values.end(), std::ostream_iterator<int> (std::cout, " "));
std::cout << std::endl;
return 0;
}
#包括
#包括
#包括
#包括
使用命名空间推力::占位符;
模板
类平铺范围
//平铺区域的代码。。。。
//
内部主(空)
{
推力:设备_矢量数据(6);
数据[0]=0;数据[1]=1;数据[2]=2;数据[3]=3;数据[4]=4;数据[5]=5;
推力:装置_矢量值(12);
值[0]=0;值[6]=3382;
值[1]=3382;值[7]=0;
数值[2]=1863;数值[8]=251;
数值[3]=470;数值[9]=1394;
数值[4]=311;数值[10]=5651;
数值[5]=2017;数值[11]=257;
平铺的_范围键(data.begin(),data.end(),2);
推力:设备向量键n(keys.begin(),keys.end());
std::难道你不能对平铺区域进行排序吗?因为它是不可变的--值实际上不存在于内存中的任何地方。我不确定你的示例代码为什么能够编译--似乎它不应该能够。为了使你的代码工作,你应该在排序之前将平铺区域
复制到临时存储中。谢谢J谢谢你的解释,这就是我刚才所做的,工作正常。我不知道为什么它会被编译。。。