CUDA推力:如何实现支持“模板”的“分区”?

时间:2012-08-21 03:07:27

标签: 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:我发现"partition"函数几乎就是答案,只是它只支持谓词。有没有解决方法?

非常感谢任何提示!

2 个答案:

答案 0 :(得分:1)

这可以使用thrust::stable_sort_by_key()实现。

答案 1 :(得分:1)

现在已经实施了带有模板的thrust::partitionthrust::stable_partition(可能需要从official Thrust repository获取来源),这可以通过以下方式实现:

#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());

导致:

    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

由于我们没有对两个分区中的值进行排序,因此这种实现更有效。可以使用类似且更复杂的示例here(答案中有更多详细信息)。