2012-10-22 79 views
1

我正在使用CUDA並面臨以下問題。 我有陣列的結構如下:使用Thrust對數組結構進行排序

typedef struct Edge{ 
    int *from, *to, *weight; 
} 

我想排序權重陣列上的這種結構使得相應的「從」和「到」陣列太更新。我想過使用Thrust庫,但它只適用於矢量是我的理解。我可以sort_by_key並得到兩個數組排序,但我無法理解如何排序三個數組?我甚至看過zip_iterator,但不知道如何使用它來達到我的目的。請幫助

+1

不需要'sort_by_key'函數。您必須爲'struct Edge'創建一個比較函子,並使用簡單的'thrust :: sort'函數進行排序。 – sgarizvi

+0

謝謝,但你能否告訴我如何在CUDA中編寫比較函子? – user1439690

回答

2

首先將結構解耦爲1)鍵和2)填充。然後對鍵進行排序並相應地重新排序填充。例如,打破這種結構:

typedef struct Edge{ 
    int from, to, weight; 
} 

到:

int weight[N]; 
typedef struct Edge{ 
    int from, to; 
} 

完整的代碼是在這裏:

#include <thrust/device_vector.h> 
#include <thrust/host_vector.h> 
#include <cmath> 
#include <thrust/sort.h> 

typedef struct pad { 
     int from; 
     int to; 
} padd; 

__host__ padd randPad() { 
     padd p; 
     p.from = rand(); 
     p.to = rand(); 
     return p; 
} 

__host__ std::ostream& operator<< (std::ostream& os, const padd& p) { 
     os << "(" << p.to << " , " << p.from << ")"; 
     return os; 
} 

int main(void) 
{ 
    // allocation 
    #define N 4 
    thrust::host_vector<int> h_keys(4); 
    thrust::host_vector<padd> h_pad(4); 

    // initilization 
    thrust::generate(h_keys.begin(), h_keys.end(), rand); 
    thrust::generate(h_pad.begin(), h_pad.end(), randPad); 

    // print unsorted data 
    std::cout<<"Unsorted keys\n"; 
    thrust::copy(h_keys.begin(), h_keys.end(), std::ostream_iterator<int>(std::cout, "\n")); 
    std::cout<<"\nUnsorted paddings\n"; 
    thrust::copy(h_pad.begin(), h_pad.end(), std::ostream_iterator<padd>(std::cout, "\n")); 

    // transfer to device 
    thrust::device_vector<int> d_keys = h_keys; 
    thrust::device_vector<padd> d_pad = h_pad; 
    //thrust::sort(d_keys.begin(), d_keys.end()); 

    // sort 
    thrust::sort_by_key(d_keys.begin(), d_keys.end(), d_pad.begin()); 

    // transfer back to host 
    thrust::copy(d_keys.begin(), d_keys.end(), h_keys.begin()); 
    thrust::copy(d_pad.begin(), d_pad.end(), h_pad.begin()); 

    // print the results 
    std::cout<<"\nSorted keys\n"; 
    thrust::copy(h_keys.begin(), h_keys.end(), std::ostream_iterator<int>(std::cout, "\n")); 
    std::cout<<"\nSorted paddings\n"; 
    thrust::copy(h_pad.begin(), h_pad.end(), std::ostream_iterator<padd>(std::cout, "\n")); 

    return 0; 
} 

輸出結果是這樣的:

Unsorted keys 
1804289383 
846930886 
1681692777 
1714636915 

Unsorted paddings 
(424238335 , 1957747793) 
(1649760492 , 719885386) 
(1189641421 , 596516649) 
(1350490027 , 1025202362) 

Sorted keys 
846930886 
1681692777 
1714636915 
1804289383 

Sorted paddings 
(1649760492 , 719885386) 
(1189641421 , 596516649) 
(1350490027 , 1025202362) 
(424238335 , 1957747793) 
+0

好吧,我讀了一些關於使用第一sort_by_key和創建一個對應的排序索引數組。然後我使用該索引數組對我剩下的兩個數組進行排序。 – user1439690