我有如下代码:
...
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),我不知道。有办法吗?
答案 0 :(得分:2)
有办法吗?
是的,一种可能的方法是使用thrust::sort_by_key
,它允许您使用设备指针对设备数据进行排序。
此blog说明了推力和OpenACC之间的接口方法。包括在例程之间传递deviceptr
。
此example code可能很有趣。具体来说,hash example提供了一个从OpenACC调用thrust::sort_by_key
的完整示例。