如何对 CUDA 向量类型数组进行排序
How to sort an array of CUDA vector types
具体来说,我该如何对 float3
的数组进行排序?这样 .x
组件是主要排序标准,.y
组件是次要排序标准,.z
组件是第三排序标准。
是否有一个简单的解决方案可以对 cub:: DeviceRadixSort
或 thrust::sort_by_key
进行一次调用?
目前我在想也许我可以创建一个 uint32
键数组,其中每个元素的前三分之一数字取自输入数组 .x
组件的前三分之一,第二个三分之一的数字取自输入数组的前三分之一 .y
组件,最后三分之一的数字取自输入数组的前三分之一的 .z
组件。或者有更好的解决方案吗?
使用 that 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;
}
具体来说,我该如何对 float3
的数组进行排序?这样 .x
组件是主要排序标准,.y
组件是次要排序标准,.z
组件是第三排序标准。
是否有一个简单的解决方案可以对 cub:: DeviceRadixSort
或 thrust::sort_by_key
进行一次调用?
目前我在想也许我可以创建一个 uint32
键数组,其中每个元素的前三分之一数字取自输入数组 .x
组件的前三分之一,第二个三分之一的数字取自输入数组的前三分之一 .y
组件,最后三分之一的数字取自输入数组的前三分之一的 .z
组件。或者有更好的解决方案吗?
使用
#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;
}