我正在尋找一種CUDA上的排序算法,它可以對元素(double)的數組A進行排序並返回該數組A的鍵B的陣列。 我知道Thrust庫中的sort_by_key
函數但我希望我的元素A數組保持不變。 我能做什麼?CUDA推力和sort_by_key
我的代碼是:
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
SOLUTION:
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是我的雙值進行排序
在排序前製作A的副本嗎?此外,如果您是推力用戶,則可能需要考慮加入[推力谷歌組合](https://groups.google.com/forum/?fromgroups#!forum/thrust-users)。 –
是的,我做過了,但性能大大降低了 –
也許您應該發佈一些代碼並回答有關尺寸的問題。我預計分類操作的成本將顯着高於矢量拷貝的成本。 –