CUDA推力:如何实现;分区;支持",;模板;?

CUDA推力:如何实现;分区;支持",;模板;?,cuda,thrust,Cuda,Thrust,假设有一个整数数组: A[]={2, 2, 9, 8, 5, 7, 0, 6} 和一个模板: B[]={1, 0, 0, 1, 1, 1, 0, 1} 我的问题是,我们如何根据B[]重新排列A[],这样,如果B[i]==1,B[j]==0,那么A[i]将保证在新数组中位于A[j]之前,如下所示: C[]={2, 8, 5, 7, 6, 2, 9, 0} PS:我发现这个函数几乎就是答案,只是它只支持谓词。有什么解决办法吗 任何提示都将不胜感激 这可以使用来实现。现在已经使用模具实现了推力:

假设有一个整数数组:

A[]={2, 2, 9, 8, 5, 7, 0, 6}
和一个模板:

B[]={1, 0, 0, 1, 1, 1, 0, 1}
我的问题是,我们如何根据B[]重新排列A[],这样,如果B[i]==1,B[j]==0,那么A[i]将保证在新数组中位于A[j]之前,如下所示:

C[]={2, 8, 5, 7, 6, 2, 9, 0}
PS:我发现这个函数几乎就是答案,只是它只支持谓词。有什么解决办法吗


任何提示都将不胜感激

这可以使用来实现。

现在已经使用模具实现了
推力::分区
推力::稳定分区
(可能需要从中获取源代码),这可以通过以下方式实现:

#include <thrust/partition.h>

struct is_one
{
  __host__ __device__
  bool operator()(const int &x)
  {
    return x == 1;
  }
};

// Partition values on device thanks to stencil
thrust::stable_partition(d_A.begin(),
                         d_A.end(),
                         d_B.begin(),
                         is_one());
#包括
结构是一个
{
__主机设备__
布尔运算符()(常量int&x)
{
返回x==1;
}
};
//由于模具,设备上的分区值
推力::稳定的分区(d_.A.begin(),
d_A.end(),
d_B.begin(),
这是你的第一次;
这导致:

A = 0 1 2 3 4 5 6 7 8 9 B = 0 1 1 0 0 1 0 0 1 0 C = 1 2 5 8 0 3 4 6 7 9 A=0123456789 B=01101010 C=1 2 5 8 0 3 4 6 7 9
由于我们没有对两个分区中的值进行排序,因此这种实现更有效。还有一个类似的、更复杂的例子(答案中有更多细节)。

这不是一个稳定的按键排序吗?这在一开始对我来说并不明显。非常感谢,@talonmies!看起来像
分区
-带有模具的API中有一个已知的孔: