2012-06-13 20 views
1

我有一組整數值,我想用Thrust對它們進行排序。是否有可能在此排序中僅使用一些高位/低位。如果可能的話,我不想使用用戶定義的比較器,因爲它會將使用的算法從基數排序更改爲合併排序並相當多地增加已用時間。如何使用Thrust庫對按鍵進行較低精度排序

我認爲,當所有的數字有一點相同的值,而排序位被跳過,所以它是可行的使用盡可能低的比特數,並希望這將是足夠的。 (即:用於使用與8位字符和設定高3位到0 5個比特)

實施例:

sort<4, 0>(myvector.begin(), myvector.end()) 
sort<4, 1>(myvector.begin(), myvector.end()) 

排序僅使用4位,高或低..

東西類似 http://www.moderngpu.com/sort/mgpusort.html

+0

沒有明確的方法來做到這一點,它通常是沒有必要的。 'thrust :: sort'的基數排序將檢查數據並省略零位中的多餘通行。 –

+0

是的,當我對矢量進行排序時,根據所包含的值得到不同的經過時間值。即使包含的值是相同的,當容器的類型爲int,short或byte時,我也會得到不同的經過時間值。當數字被簽名時它會增加一點。但正如你所說,它忽略了所有零的位。 – phoad

+0

我認爲@JaredHoberock的評論是一個合適的答案。如果您將您的評論轉換爲答案,我可以將其指定爲接受的答案。 – phoad

回答

1

推力的接口抽象了算法的實現細節,比如一個事實,即當前的排序策略之一是基數排序。由於潛在的排序實現可能會因版本,版本,後端到後端,甚至調用調用而發生變化,因此用戶無法溝通要排序的位數。

幸運的是,這種明確的信息通常是沒有必要的。適當時,Thrust當前的排序實現將檢查排序鍵,並省略零位中的多餘計算。

0

如何使用transformer_iterator? 下面是一個簡短的例子(按第一位排序),您可以爲自己的目的編寫自己的一元函數。

#include <iostream> 
#include <thrust/device_vector.h> 
#include <thrust/iterator/transform_iterator.h> 
#include <thrust/sort.h> 

using namespace std; 
struct and_func : public thrust::unary_function<int,int> 
{ 
    __host__ __device__ 
     int operator()(int x) 
     { 
      return 8&x; 
     } 
}; 
int main() 
{ 
    thrust::device_vector<int> d_vec(4); 
    d_vec[0] = 10; 
    d_vec[1] = 8; 
    d_vec[2] = 12; 
    d_vec[3] = 1; 
    thrust::sort_by_key(thrust::make_transform_iterator(d_vec.begin(), and_func()), 
       thrust::make_transform_iterator(d_vec.end(), and_func()), 
       d_vec.begin()); 
    for (int i = 0; i < 4; i++) 
     cout<<d_vec[i]<<" "; 
    cout<<"\n"<<endl; 
    return 0; 
} 
+3

不,'thrust :: sort'不適用於'transform_iterator'。 'transform_iterator'通常不可變。 –

+0

實際上,我通過兩次冪來劃分值,或者在排序之前將它們轉換爲更簡單的類型......我的初始值是浮點值,並且我將它們縮放並轉換爲短類型。我不確定將浮點值轉換爲簡短類型並對它們進行排序是一種過度優化嘗試或不是。 – phoad

+0

感謝@JaredHoberock指出我的錯誤,我以前從未注意到這一點。 – syoummer

相關問題