我是一名有用的助手,可以为您翻译文本。
我正在寻找一种基于CUDA的排序算法,可以对元素数组A(双精度)进行排序,并返回该数组A的键数组B。 我知道Thrust库中的
我的代码如下:
我正在将推力算法与我在顺序CPU上拥有的其他算法进行比较。
我正在寻找一种基于CUDA的排序算法,可以对元素数组A(双精度)进行排序,并返回该数组A的键数组B。 我知道Thrust库中的
sort_by_key
函数,但我希望我的元素数组A保持不变。
我该怎么做?我的代码如下:
void sortCUDA(double V[], int P[], int N) {
real_t *Vcpy = (double*) malloc(N*sizeof(double));
memcpy(Vcpy,V,N*sizeof(double));
thrust::sort_by_key(V, V + N, P);
free(Vcpy);
}
我正在将推力算法与我在顺序CPU上拥有的其他算法进行比较。
N mergesort sortCUDA
113 0.000008 0.000010
226 0.000018 0.000016
452 0.000036 0.000020
905 0.000061 0.000034
1810 0.000135 0.000071
3621 0.000297 0.000156
7242 0.000917 0.000338
14484 0.001421 0.000853
28968 0.003069 0.001931
57937 0.006666 0.003939
115874 0.014435 0.008025
231749 0.031059 0.016718
463499 0.067407 0.039848
926999 0.148170 0.118003
1853998 0.329005 0.260837
3707996 0.731768 0.544357
7415992 1.638445 1.073755
14831984 3.668039 2.150179
115035495 39.276560 19.812200
230070990 87.750377 39.762915
460141980 200.940501 74.605219
推进性能还不错,但我认为如果使用 OMP 可能可以轻松获得更好的 CPU 时间。
我认为这是由于 memcpy 引起的。
解决方案:
void thrustSort(double V[], int P[], int N)
{
thrust::device_vector<int> d_P(N);
thrust::device_vector<double> d_V(V, V + N);
thrust::sequence(d_P.begin(), d_P.end());
thrust::sort_by_key(d_V.begin(), d_V.end(), d_P.begin());
thrust::copy(d_P.begin(),d_P.end(),P);
}
其中V是需要排序的双精度数值