2013-06-12 1 views
0

Я использую вектор тяги.Зеркальное переупорядочение в Thrust

Я ищу элегантный способ переназначения вектора тяги, устройства, используя «зеркальное» упорядочение, (пример, приведенный, не может найти любую функцию, что в Thrust)

Например, предположим, что мой вектор содержит структуру, каждая структура содержит несколько чисел. мой вектор выглядит следующим образом

[1,2] [5,4] [-2,5]  [6,1]  [2,6] 

после операции зеркала переупорядочения я хотел бы получить следующий вектор (1-й элемент переключился с п-го элемента) (элемент я переключился с щ элемента , и т. д.)

[2,6] [6,1] [-2,5] [5,4] [1,2] 

Есть ли какой-либо изящный способ сделать это в Thrust?

BTW, я думал о том, чтобы предоставить каждой структуре уникальный идентификационный номер и отсортировать в соответствии с этим номером, таким образом, я мог бы «зеркально» изменить порядок вектора, используя сортировку.

+0

не ставь тег в заглавии вас вопросом. Это не обязательно. [SO] имеет теги, повторение их в заголовке не просто необязательно, но и нежелательно. – talonmies

+2

Разве это не просто «толчок :: обратный»? –

+0

@ Jared Hoberock, вы правы, это просто, как наоборот, напишите ответ, и я отвечу вам как правильный ответ. Http: //thrust.github.io/doc/namespacethrust.html#a076e8291a8d5a1748cc4623b8c758c93 – TripleS

ответ

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] 
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; 
} 
+0

Я думаю, что предложение от Джареда Хоброка проще. –