使用Thrust CUDA对对象进行排序

liz*_*liz 7 sorting cuda thrust cudpp

是否可以使用Thrust库对对象进行排序?我有以下结构:

struct OB{
  int N;
  Cls *C; //CLS is another struct.
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用推力来根据N对OB阵列进行排序?你能提供一个关于使用推力对物体进行分类的简单例子吗?如果推力不能这样做,是否还有其他CUDA库允许我这样做?

Dav*_*nic 14

thrust :: sort的文档显示它接受一个比较运算符.在他们的示例中查看如何定义和使用它们.我没有对此进行测试,但基于该示例,您只需要一个看起来像这样的结构:

struct OBCmp {
  __host__ __device__
  bool operator()(const OB& o1, const OB& o2) {
      return o1.N < o2.N;
  }
};
Run Code Online (Sandbox Code Playgroud)

然后只是调用thrust::sort(obs.begin(), obs.end(), OBCmp()).


pho*_*oad 6

即使您可以使用特殊的结构定义对对象进行排序,使用结构作为仿函数,它也会将排序算法从基数排序更改为合并排序.基数排序的速度明显快于合并排序.所以在使用推力时,尽量使用整数类型作为键值.

我建议你使用"thrust :: sory_by_key(..)"函数.

您应该将结构从AOS更改为SOA结构.

struct OB{
  int N;
  Cls *C; //CLS is another struct.
}
Run Code Online (Sandbox Code Playgroud)

struct OBs{
   int []Ns; -> thrust::device_vector<int> indices;
   Cls *C[]; -> thrust::device_vector<Cls> values;
}
Run Code Online (Sandbox Code Playgroud)

使用sort_by_key对索引进行排序时,将对值进行排序.

thrust::sort_by_key(indices.begin(), indices.end(), values.begin());
Run Code Online (Sandbox Code Playgroud)


小智 -1

到目前为止,您无法对自定义对象进行排序。您可以进行基于键的排序,但不能对自定义对象进行排序,例如您提到的结构。还有一些其他基于 CUDA 的开放算法可用于执行此操作,但这也需要进行一些修改等才能使它们为您工作。