我可以假設stable_sort_by_key執行的推力unsigned int具有復雜性O(n)嗎?如果不是,我應該怎么做才能確保實作這種復雜性?(除了我自己實作基數排序)
uj5u.com熱心網友回復:
這在一定程度上取決于您的情況/觀點。僅從 docs/API 來看,似乎并不能保證使用基數排序thrust::stable_sort_by_key的鍵。unsigned int
另一方面,必要的演算法cub::DeviceRadixSort::SortPairs是在 Thrust 在后端使用的 CUB 庫中實作的,并且 Thrust 沒有充分的理由不使用它,因為在編譯時可以很容易地查詢先決條件。
從代碼中thrust/system/cuda/detail/sort.h(“詳細資訊”應該警告您這不是公共 API 的一部分)可以看到,至少在主分支thrust::stable_sort_by_key上可以cub::DeviceRadixSort::SortPairs在正確的情況下(算術鍵型別和使用thrust::less或作為比較操作)啟動撰寫本文時的推力(ca. v2.0.0rc2)但可能已經很長時間了。否則它將退回到合并排序。thrust::greater
cub::DeviceRadixSort::SortPairs即使這對您來說已經足夠了,直接使用也會有好處,因為這樣可以更輕松地重用臨時緩沖區并避免不必要的同步。兩者都可以在 Thrust 中通過
auto exec = thrust::cuda::par_nosync(custom_allocator).on(custom_stream);
執行策略(最新的 CUDA Toolkit 11.8 仍然帶有舊的 Thrust v1.15 而沒有 v1.16 par_nosync)。使用 Thrust 無法避免的一件事是排序演算法的就地性質,這是通過可能將結果復制回輸入緩沖區來實作的。這些復制操作只能使用 CUB 省略。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/532706.html
標籤:C 多线程库达推力
