繁体   English   中英

如何使用 CUDA/Thrust 根据 arrays 之一中的值对两个数组/向量进行排序

[英]How to sort two arrays/vectors in respect to values in one of the arrays, using CUDA/Thrust

这是一个关于编程的概念性问题。

总而言之,我有两个数组/向量,我需要对一个数组/向量进行排序,其中一个也传播到另一个数组中,这样如果我对 arrayOne 进行排序,对于排序中的每个交换,同样的事情也会发生在 arrayTwo 上。 现在,我知道 std::sort 允许您定义比较 function (对于我假设的自定义对象),我正在考虑定义一个同时交换 arrayTwo 。

所以我想要的是 -使用 CUDA 根据其中一个向量中的值对两个向量进行排序。

这是我不确定性上升的地方,本质上我想使用 Thrust 库进行排序。 是否支持自定义比较function 的定义? 如果是这样,我仍然没有弄清楚如何在 arrayTwo 中传播更改(因为它将基于 CUDA)。

我真的没有时间在 CUDA 上实现自定义并行快速排序,就像我应该/想要的那样。

原因

本质上,我需要对一堆 arrays 变量与单个数组(想想回归树)进行排序和计算。 当然,我需要尽快这样做,基于 CPU 的排序还不够快。

#更新

我应该强调,我在主机上对两者进行排序没有问题,我正在寻找使用CUDA的解决方案。 谢谢。

#更新 2

我想我实际上很幸运并找到了解决方案,因为我发布了这个问题,事实证明 Thrust 实际上提供了我正在寻找的默认内容:

#include <thrust/sort.h>
  ...
  const int N = 6;
  int    keys[N] = {  1,   4,   2,   8,   5,   7};
  char values[N] = {'a', 'b', 'c', 'd', 'e', 'f'};
  thrust::sort_by_key(keys, keys + N, values);
  // keys is now   {  1,   2,   4,   5,   7,   8}
  // values is now {'a', 'c', 'b', 'e', 'f', 'd'}

*取自http://code.google.com/p/thrust/wiki/QuickStartGuide#Fancy_Iterators *

所以,现在我要做的就是从两个 arrays (我必须从二维数组中取出)中取出两个推力::device_vectors。 快乐的。

创建一个包含 integer 索引的向量,初始化为 { 0, 1, 2, 3, etc }。 每个 integer 代表向量中的一个 position。 使用自定义比较 function 对索引向量进行排序,该比较使用索引来引用 vector1。 完成后,您可以使用已排序的索引对 vector1vector2 重新排序。

但我认为你不能就地进行这种重新排序,所以无论如何你都必须从一个向量复制到另一个向量,所以我认为 Kerrek 的建议也很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM