Cudaで選択ソートを実装しようとしていますが、これまでのところ成功していません。選択Cudaで並べ替え
__device__ void selection_sort(int *data, int left, int right){
for(int i = left ; i <= right ; ++i){
int min_val = data[i];
int min_idx = i;
// Find the smallest value in the range [left, right].
for(int j = i+1 ; j <= right ; ++j){
int val_j = data[j];
if(val_j < min_val){
min_idx = j;
min_val = val_j;
}
}
// Swap the values.
if(i != min_idx){
data[min_idx] = data[i];
data[i] = min_val;
}
}
}
ここに私の主な試みは、最小を見つけ、解決策を並列化することです。今、私はコードがC++のように見えることを理解していますが、私はCudaの熟練者ではありません。
ソリューションを並列化する方法はありますか?これ以上の追加はありませんか? 還元と呼ばれる問題の広く知られており、十分に文書クラスに
for i from N-1 down to 0
find the maximum element among data[0] ~ data[i]
swap that maximum element with data[i] within the data array
最初の部分(最大の要素を見つける)下がる:N
番号の
私は選択ソートを並行して書き換えることはできません。並列ソートソリューションが必要な場合は、bubble/merge/bitonicソートを試してみてください。 – halfelf
私はあなたの質問を理解していません。あなたが投稿したのはデバイス機能です。デバイス関数は、個々のスレッドによって実行され、カーネル内から呼び出される関数です。それらの定義によって、それらはシリアル操作である。だから、あなたが "成功していない"と言ったとき、それは何を意味するのですか?そして、あなたが「ソリューションを並列化したい」と言うと、この '__device__'関数の意味で*正確に*何を意味していますか? – talonmies
従来の比較ソートアルゴリズムは、マルチプロセッサアーキテクチャにうまく対応しません。並行ソートはまだ研究中であり、かなり難しい問題です。最初に簡単なものから始めなければならないかもしれません。しかし、あなたが献身的で、何に関係なく学びたい場合は、 [Sorting Networks](https://en.wikipedia.org/wiki/Sorting_network)、[Coleの並列マージソート](https://en.wikipedia.org/wiki/Merge_sort#Parallel_merge_sort)、CUDAツールキットに付属するquicksortサンプルスラストライブラリのソート機能 – Drop