首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CUDPP/推力的分段排序

使用CUDPP/推力的分段排序
EN

Stack Overflow用户
提问于 2012-10-21 02:36:19
回答 1查看 1.6K关注 0票数 1

是否可以在CUDA中使用CUDPP进行分段排序?通过分段排序,我的意思是对数组中受如下标志保护的元素进行排序。

代码语言:javascript
复制
A[10,9,8,7,6,5,4,3,2,1]

Flag array[1,0,1,0,0,1,0,0,0,0]

对A中在连续1之间的元素进行排序。

预期输出

代码语言:javascript
复制
[9,10,6,7,8,1,2,3,4,5]
EN

回答 1

Stack Overflow用户

发布于 2012-11-23 01:33:27

您可以在单个排序过程中完成此操作:其思想是调整数组中的元素,以便排序将只在“段”内重新定位元素。

对于您的示例:

代码语言:javascript
复制
A[10,9,8,7,6,5,4,3,2,1]
flag[0,0,1,0,0,1,0,0,0,0] 

(我删除了第一个1,因为不需要它)

首先扫描标志数组:

代码语言:javascript
复制
scanned_flag[0,0,1,1,1,2,2,2,2,2]

然后,根据数字类型,您有许多选项,例如,对于无符号整数,您可以设置最高位来区分“段”。最简单的方法是将乘以scanned_flags的最大元素相加:

代码语言:javascript
复制
A + scanned_flag*10 = [10,9,18,17,16,25,24,23,22,21]

剩下的很简单:对数组进行排序并反转转换。这里有两个版本:使用Arrayfire和推力。勾选你更喜欢的那个。

Arrayfire:

代码语言:javascript
复制
void af_test() {
 int A[] = {10,9,8,7,6,5,4,3,2,1};  
 int S[] = {0, 0,1,0,0,1,0,0,0,0};  
 int n = sizeof(A) / sizeof(int);

 af::array devA(n, A, af::afHost);
 af::array devS(n, S, af::afHost);
 // obtain the max element
 int maxi = af::max< int >(devS);

 // scan the keys
 // keys = 0,0,1,1,1,2,2,2,2,2
 af::array keys = af::accum(devS);

 // compute: A = A + keys * maxi
 // A = 10,9,18,17,16,25,24,23,22,21
 devA = devA + keys * maxi;

 // sort the array
 // A = 9,10,16,17,18,21,22,23,24,25
 devA = af::sort(devA);

 // compute: A = A - keys * maxi
 // A = 9,10,6,7,8,1,2,3,4,5
 devA = devA - keys * maxi;
 // print the results
 print(devA);
}

推力:

代码语言:javascript
复制
template<typename T>
struct add_mul : public binary_function<T,T,T>
{
add_mul(const T& _factor) : factor(_factor) {
}
   __host__ __device__ T operator()(const T& a, const T& b) const 
{
    return (a + b * factor);
}
const T factor;
}; 

void thrust_test()
{
  int A[] = {10,9,8,7,6,5,4,3,2,1};  
  int S[] = {0, 0,1,0,0,1,0,0,0,0};  
  int n = sizeof(A) / sizeof(int);
  thrust::host_vector< int > hA(A, A + n), hS(S, S + n);

  thrust::device_vector< int > devA = hA, devS = hS, keys(n);
  // scan the keys 
  thrust::inclusive_scan(devS.begin(), devS.end(), keys.begin());
  // obtain the maximal element
  int maxi = *(thrust::max_element(devA.begin(), devA.end()));
  // compute: A = A + keys * maxi
  thrust::transform(devA.begin(), devA.end(), keys.begin(), devA.begin(), add_mul< int >(maxi)); 
  // sort the array
  thrust::sort(devA.begin(), devA.end());
  // compute: A = A - keys * maxi
  thrust::transform(devA.begin(), devA.end(), keys.begin(), devA.begin(), add_mul< int >(-maxi)); 
  // copy back to the host 
  hA = devA;
  std::cout << "\nSorted array\n";
  thrust::copy(hA.begin(), hA.end(), std::ostream_iterator<int>(std::cout, "\n"));
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12991490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档