CPUsort
でのソートに役立つ、STL の関数用に独自のコンパレーターを実装std::vector< std::vector<int> >
しました。ユーザーは、入力として aと、たとえば のような文字列変数を指定します。この文字列を使用すると、ソートは最初の列で最初に行われ、次に 3 番目の列で、次に 2 番目の列で行われます。例:std::vector< std::vector<int> >
021
1 2 3
3 2 1
1 1 1
1 1 2
文字列が10
出力は次のようになります。
1 1 1
1 1 2
1 2 3
3 2 1
私の CPU 実装は というクラスを使用しますSorting
。このクラスは次の 2 つのファイルで実装されます。
Sorting.h
class Sorting{
private:
public:
Sorting();
~Sorting();
std::vector<std::vector<int>> applySort(std::vector<std::vector<int>>
data,const std::string& attr);
};
Sorting.cpp
Sorting::Sorting(){}
Sorting::~Sorting(){}
std::vector<std::vector<int>> Sorting::applySort(
std::vector<std::vector<int>> data, const std::string& attr){
std::sort(data.begin(), data.begin()+data.size(), Comparator(attr));
return data;
}
Comparator.h
class Comparator{
private:
std::string attr;
public:
Comparator(const std::string& attr) { this->attr = attr; }
bool operator()(const std::vector<int>& first, const std::vector<int>&
second){
size_t i;
for(i=0;i<attr.size();i++){
if(first[attr.at(i) - '0'] < second[attr.at(i) - '0']) return true;
else if(first[attr.at(i) - '0'] > second[attr.at(i)-'0'])
return false;
}
return false;
}
};
私の実装はテスト済みで、正しく動作します。出力をより高速に生成するために、GPU の機能を利用する同様の CUDA 実装を行うことに興味があります。
最初は、私の目標が少しわかりにくいので、GPU での並べ替えの既に知られている実装を変更することで、私の仕事がうまくいくかもしれないと考えました。ただし、ここで説明されているような多くの実装を検索し始めました: http://blogs.nvidia.com/2012/09/how-tesla-k20-speeds-up-quicksort-a-familiar-comp-sci-code/とそれ達成するのは難しいことだと思い知らされました。
これが最善の策かどうかはわかりません。ライブラリの検索を開始し、 を見つけましThrust
た。ただし、Thrust では独自のコンパレータを定義できますが、昨日尋ねた質問host_vector < host_vector<int> >
で、 .
そして、ベクトルのベクトルを単一のベクトルに変換しても、コンパレータ クラスをどのように実装する必要があるのか わからないため、あまり役に立たないと思います。
この問題についてあなたの意見を聞きたいです:
- この問題にどのようにアプローチすればよいですか?
- でそれを達成することは可能
Thrust
ですか? - GPU で実行すると、コード全体のパフォーマンスが大幅に向上しますか? ベクトルのベクトルは、何百万行にもなる巨大なものになる可能性がありますが、数列 (5 ~ 10) しかないことに注意してください。
- 独自の並べ替えを設計するか、既に利用可能な並べ替え機能を変更した方がよいでしょうか? これは良いアイデアのように聞こえますが、実際には達成するのに多くの努力が必要になると感じています. ライブラリの単純なコンパレータとソート関数を使用するのが最善ですが、制限により
Thrust
そうすることができません。
前もって感謝します