在GPU上对另一个数组进行排序

时间:2018-07-15 22:17:27

标签: sorting cuda gpgpu openacc

我有如下代码:

...
const N=10000; 
std::array<std::pair <int,int>,N> nnt; 
bool compar(std::pair<int,int> i, std::pair <int,int> j) {return (int) 
(i.second) > (int)(j.second);}
...
int main(int argc, char **argv)
{
  #pragma acc data create(...,nnt)
    {
       #pragma acc parallel loop
         {...}
         //the nnt array is filled here
         //here i need to sort nnt allocated on gpu, using the 
         //comparator compar()
    }
}

因此,我需要对通过OpenAcc的CUDA分配在GPU上的对数组进行排序。 据我了解,我不太可能在GPU上对std :: pair的std :: array进行排序。

实际上,我需要对分配在gpu上的一个数组与分配在gpu上的另一个数组i进行排序。 e。如果有

int a[N];
int b[N];

通过CUDA或OpenAcc分配或复制到GPU,我需要通过数组b的值对数组a进行排序,并且我需要在GPU上进行这种排序。可能是有些CUDA功能会有所帮助,或者可以使用CUDA Thrust排序功能(例如推力:: stable_sort),我不知道。有办法吗?

1 个答案:

答案 0 :(得分:2)

  

有办法吗?

是的,一种可能的方法是使用thrust::sort_by_key,它允许您使用设备指针对设备数据进行排序。

blog说明了推力和OpenACC之间的接口方法。包括在例程之间传递deviceptr

example code可能很有趣。具体来说,hash example提供了一个从OpenACC调用thrust::sort_by_key的完整示例。