2015-10-08 58 views
0

具體如何排序float3的數組?因此,.x組件是主要的分類標準,.y組件是次要分類標準,而.z組件是第三級分類標準。如何對CUDA矢量類型的數組進行排序

有沒有一個簡單的解決方案,可以打一個電話cub:: DeviceRadixSortthrust::sort_by_key

目前我想也許我可以創建一個uint32鍵陣列,其中每個元素的前三分之一的數字取自輸入數組的第一個三分之一的組成部分,第一個三分之一的數字取自第一個數字輸入陣列的第三個組件爲.y,最後三分之一的數字取自輸入陣列的第一個三分之一組件.z。還是有更好的解決方案?

+1

您可以使用像[this]這樣的方法(http://stackoverflow.com/questions/29597224/sorting-packed-vertices-with-thrust)。你需要'sort_by_key'嗎?從這個問題來看,我不清楚你是做什麼的。你只需要構建一個推力函子來建立你想要的排序規則。 –

+0

你的權利。我不需要鑰匙,我只是認爲這將是避免提取單個元素的有用工具。您指出的解決方案看起來非常有用,儘管我對函子不太熟悉。你有很好的參考/例子嗎?特別是解釋函子論證的東西? – inJeans

+1

函數是一個C++函數對象。如果你谷歌,你會發現許多參考指南,如[這一個](http://www.cprogramming.com/tutorial/functors-function-objects-in-c++.html)。這不是一個推動特定的概念。此外,推力[快速入門指南](https://github.com/thrust/thrust/wiki/Quick-Start-Guide)很有用,但它並不專門針對函子。如果你想進行推力編程,函子是相當重要的工具。但除此之外,先前鏈接的例子的一個簡單的修改可以用來對推力中的「float3」數組進行排序。 –

回答

2

使用exampleRobert Crovella建議我製作了以下解決方案。再次感謝Rob。

#include <thrust/sort.h> 
#include <thrust/device_ptr.h> 

struct sort_float3 { 
    __host__ __device__ 
    bool operator()(const float3 &a, const float3 &b) const { 

    if  (a.x <= b.x && a.y <= b.y && a.z < b.z) return true; 
    else if (a.x <= b.x && a.y < b.y) return true; 
    else if (a.x < b.x) return true; 
    else return false; 
    } 
}; 

int main(void) 
{ 
    float3 *h_array; 
    // Define your host array 
    float3 *d_array; 
    cudaMallocHost((void**)&d_array, 
        number_of_elements * sizeof(float3));  
    cudaMemcpy(d_array, 
       h_array, 
       number_of_elements * sizeof(float3), 
       cudaMemcpyHostToDevice); 

    thrust::device_ptr<float3> th_array(d_array); 
    thrust::sort(th_array, 
        th_array+number_of_elements , 
        sort_float3()); 
    return 0; 
}