C++ 如何使用CUDA/ARTH根据其中一个数组中的值对两个数组/向量进行排序

C++ 如何使用CUDA/ARTH根据其中一个数组中的值对两个数组/向量进行排序,c++,sorting,cuda,std,thrust,C++,Sorting,Cuda,Std,Thrust,这是一个关于编程的概念性问题 总而言之,我有两个数组/向量,我需要对其中一个数组/向量进行排序,同时对另一个数组中传播的更改进行排序,这样,如果我对arrayOne进行排序,对于排序中的每个交换,arrayTwo也会发生同样的情况。现在,我知道std::sort允许您定义一个比较函数(对于我假设的自定义对象),我正在考虑定义一个来同时交换arrayTwo 所以我想要的是-使用CUDA,根据其中一个向量中的值对两个向量进行排序。 这就是我的不确定性增加的地方,本质上我想使用推力库进行排序。它是否支

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

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

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

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

我真的没有时间在CUDA上实现定制的并行快速排序,正如我应该/想要的那样

原因

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

#更新

我要强调的是,我在主机上对这两个进行排序没有问题,我正在寻找一种使用CUDA的解决方案。谢谢

#更新2

我想我真的很幸运找到了解决办法,因为我发布了这个问题, 事实证明,推力实际上提供了我在默认情况下想要的东西:

#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'}
#包括
...
常数int N=6;
int键[N]={1,4,2,8,5,7};
字符值[N]={'a','b','c','d','e','f'};
推力::按_键对_进行排序(键,键+N,值);
//键现在是{1,2,4,5,7,8}
//值现在是{'a','c','b','e','f','d'}
*取自*


所以,现在我要做的就是从两个数组中得到两个推力::设备_向量(我必须从2D数组中得到)。快乐。

创建一个整数索引向量,初始化为{0,1,2,3等}。每个整数表示向量中的一个位置。使用自定义比较函数对索引向量进行排序,该函数使用索引引用向量1。完成后,您可以使用已排序的索引对vector1和vector2进行重新排序


但是我不认为你可以在适当的地方重新排序,所以你必须从一个向量复制到另一个向量,所以我认为Kerrek的建议也是很好的。

为什么你不做一个向量对,然后根据向量对的第一个值排序呢?为此,您当然可以将适当的谓词传递给
asch::sort
?好主意,但需要循环并赋值…除非有更好的方法可能?不,不是2D向量,而是成对向量。。。你知道,
[(1,A),(3,B),(-11,X),(1,C),…])
.Hmm,我已经使用了这项技术(我在主机上实现了快速排序,并使用了一个类似于你所说的索引数组来将更改传播到两个数组,而不是交换值,交换逻辑索引)。这对推力库有效吗?我很难想象为什么不行,但我对推力库没有经验。你有一个概念性的问题,所以我给出了一个概念性的答案。是的,你回答了!我的意思是可能有一些限制,因为推力使用GPU(以及主机)。感谢您的帮助:-)