我已经为 STL 的功能实现了自己的比较器sort
,这有助于std::vector< std::vector<int> >
在CPU上对 a 进行排序。用户将 a 和字符串变量作为输入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
,这个类是用以下两个文件实现的:
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;
}
};
我的实现已经过测试并且可以正常工作。我有兴趣做一个类似的 CUDA 实现,它可以利用 GPU 的功能来更快地产生输出。
最初我认为因为我的目标有点令人困惑,也许改变一个已知的在 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
不允许我这样做的限制。
先感谢您