使用example即Robert 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;
}
您可以使用像[this]這樣的方法(http://stackoverflow.com/questions/29597224/sorting-packed-vertices-with-thrust)。你需要'sort_by_key'嗎?從這個問題來看,我不清楚你是做什麼的。你只需要構建一個推力函子來建立你想要的排序規則。 –
你的權利。我不需要鑰匙,我只是認爲這將是避免提取單個元素的有用工具。您指出的解決方案看起來非常有用,儘管我對函子不太熟悉。你有很好的參考/例子嗎?特別是解釋函子論證的東西? – inJeans
函數是一個C++函數對象。如果你谷歌,你會發現許多參考指南,如[這一個](http://www.cprogramming.com/tutorial/functors-function-objects-in-c++.html)。這不是一個推動特定的概念。此外,推力[快速入門指南](https://github.com/thrust/thrust/wiki/Quick-Start-Guide)很有用,但它並不專門針對函子。如果你想進行推力編程,函子是相當重要的工具。但除此之外,先前鏈接的例子的一個簡單的修改可以用來對推力中的「float3」數組進行排序。 –