2012-09-08 60 views
0

我想要執行一個sort_by_key我有一個單一的鍵序列 和多值序列。按鍵排序> 10個整數序列。與推力

一個通常與

sort_by_key(
      key, 
      key + N, 
      make_zip_iterator(
           make_tuple(x1 , x2 , ...) 
           ) 
      ) 

但是我想執行> 10個序列排序的每個長度爲N的推力不支持尺寸的 元組執行此> = 10那麼,有一個周圍的方式這個 ?

當然,您可以保留key載體的單獨副本,並對10個序列串進行 排序。但我想在一個電話中做所有事情。

+0

你需要每個元組有多少個值? – talonmies

+0

我需要元組中的12個元素。 – smilingbuddha

回答

1

thrust::tuple是硬編碼總是有10個元素,所以沒有直接的方式來形成從十幾個別迭代一個zip_iterator,因此沒有在單個融合操作排序由鍵超過10次不同的迭代方式(並且沒有辦法將多於10個迭代器傳遞給用戶函子)。

如果你真的無法想到將某些單獨向量組合成單個迭代器的有用方法(例如形成元組值的向量),那麼可以使用置換迭代器。如果您創建一個從計數迭代器的陣列和那種,所以是這樣的:

device_vector<int> indices(N); 
copy(make_counting_iterator(0), make_counting_iterator(N), indices.begin()); 
sort_by_key(key, key+N, indices); 

indices現在持有有序索引到矢量否則你將已經整理。然後,您可以創建一個置換迭代器,該迭代器可用於通過密鑰「收集」輸入數據,作爲後續算法調用的一部分。您可以根據需要製作多個置換迭代器,它們可以是zip迭代器的置換,以便在隨後的代碼中提供12個輸入迭代器的不同「視圖」。

0

其實你可以使用簡單的「分散」操作。只執行一次「thrust :: sort_by_key」操作,然後對每個數據向量應用「thrust :: scatter」操作。這些值將分配到相應的位置。

thrust::sequence(indices.begin(), indices.end()); 
thrust::sort_by_key(keyvals.begin(), keyvals.end(), indices.begin()); 

//now indices keep the locations of the sorted key values 
foreach (...) { 
    thrust::scatter(data.begin(), data.end(), indices.begin(), sorteddata.begin()); 
} 

收集和分散操作是相當強大的,並打開許多機會。

+0

你的第二個代碼片段在功能上與我提出的接受答案相同。我不明白第一個代碼中的術語。 「索引」和「sorteddata」如何與原始問題相關? – talonmies

+0

我對答案做了一些更新。實際上,因爲分散操作不在原地(不是嗎?),我們需要另一個向量來保存輸出。如果在繼續操作中順序訪問這些值,將結果存儲在另一個向量中可能會導致更好的合併?否則是的,使用排列迭代器是一個更好的選擇:) – phoad