我正在使用推力矢量。
我正在寻找一种优雅的方法,使用“镜像”排序来重新排序推力设备矢量,(例如,在Thrust中找不到任何函数)
例如,假设我的向量包含一个结构,每个结构包含几个数字。 我的矢量看起来像下面的
[1,2] [5,4] [-2,5] [6,1] [2,6]
在镜像重新排序操作后,我想收到以下向量 (第1个元素用第n个元素切换) (使用n-i元素切换的i元素等)
[2,6] [6,1] [-2,5] [5,4] [1,2]
在Thrust中有没有优雅的方式呢?
顺便说一下,我正在考虑为每个结构提供一个唯一的ID号并根据该数字排序,这样我就可以“镜像”使用排序重新排序向量。答案 0 :(得分:2)
使用thrust::reverse
:
#include <thrust/device_vector.h>
#include <thrust/reverse.h>
#include <thrust/pair.h>
#include <iostream>
int main()
{
thrust::device_vector<thrust::pair<int,int> > vec;
vec.push_back(thrust::make_pair( 1,2));
vec.push_back(thrust::make_pair( 5,4));
vec.push_back(thrust::make_pair(-2,5));
vec.push_back(thrust::make_pair( 6,1));
vec.push_back(thrust::make_pair( 2,6));
std::cout << "input: " << std::endl;
for(int i = 0; i < vec.size(); ++i)
{
thrust::pair<int,int> x = vec[i];
std::cout << " [" << x.first << ", " << x.second << "]";
}
std::cout << std::endl;
thrust::reverse(vec.begin(), vec.end());
std::cout << "output: " << std::endl;
for(int i = 0; i < vec.size(); ++i)
{
thrust::pair<int,int> x = vec[i];
std::cout << " [" << x.first << ", " << x.second << "]";
}
std::cout << std::endl;
return 0;
}
输出:
$ nvcc reverse.cu -run
input:
[1, 2] [5, 4] [-2, 5] [6, 1] [2, 6]
output:
[2, 6] [6, 1] [-2, 5] [5, 4] [1, 2]
答案 1 :(得分:0)
thrust::gather允许根据地图(矢量)将源矢量元素任意复制到目标矢量元素。
这是一个有效的例子:
#include <stdio.h>
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/gather.h>
#include <thrust/sequence.h>
#define DSIZE 7
struct myStruct {
int x;
int y;
};
int main(){
// create input data
thrust::host_vector<myStruct> h(DSIZE);
for (int i=0; i< DSIZE; i++){
h[i].x = 2*i;
h[i].y = (2*i)+1;
}
// create map
thrust::device_vector<int> map(DSIZE);
thrust::sequence(map.begin(), map.end(), DSIZE-1, -1);
//move to device
thrust::device_vector<myStruct> d = h;
thrust::device_vector<myStruct> d_result(DSIZE);
thrust::gather(map.begin(), map.end(), d.begin(), d_result.begin());
//move to host
thrust::host_vector<myStruct> h_result = d_result;
for (int i = 0; i < DSIZE; i++){
printf("result[%d].x = %d, result[%d].y = %d\n", i, h_result[i].x, i, h_result[i].y);
}
return 0;
}