我使用stxxl::VECTOR_GENERATOR<MyData>::result::bufwriter_type
(类似于100M条目)填充一个非常大的数组,我需要并行排序。
我使用stxxl::sort(vector->begin(), vector->end(), cmp(), memoryAmount)
方法,理论上应该做我需要的方法:非常有效地对元素进行排序。
但是,在执行此方法期间,我注意到只有一个处理器被充分利用,而所有其他内核都处于空闲状态(我怀疑获取输入的活动很少,但实际上它们没有做任何事情)。
这是我的问题:是否可以在排序阶段利用更多内核,或者并行主要仅用于异步获取输入?如果是,是否有文件解释如何启用它? (我在网站上广泛查看了文档,但我找不到任何内容)。
非常感谢!
修改
感谢您的建议。我在下面提供了更多信息。
首先,我使用MacOs进行实验。我所做的是我启动以下程序并研究其行为。
typedef struct Triple {
long t1, t2, t3;
Triple(long s, long p, long o) {
this->t1 = s;
this->t2 = p;
this->t3 = o;
}
Triple() {
t1 = t2 = t3 = 0;
}
} Triple;
const Triple minv(std::numeric_limits<long>::min(),
std::numeric_limits<long>::min(), std::numeric_limits<long>::min());
const Triple maxv(std::numeric_limits<long>::max(),
std::numeric_limits<long>::max(), std::numeric_limits<long>::max());
struct cmp: std::less<Triple> {
bool operator ()(const Triple& a, const Triple& b) const {
if (a.t1 < b.t1) {
return true;
} else if (a.t1 == b.t1) {
if (a.t2 < b.t2) {
return true;
} else if (a.t2 == b.t2) {
return a.t3 < b.t3;
}
}
return false;
}
Triple min_value() const {
return minv;
}
Triple max_value() const {
return maxv;
}
};
typedef stxxl::VECTOR_GENERATOR<Triple>::result vector_type;
int main(int argc, const char** argv) {
vector_type vector;
vector_type::bufwriter_type writer(vector);
for (int i = 0; i < 1000000000; ++i) {
if (i % 10000000 == 0)
std::cout << "Inserting element " << i << std::endl;
Triple t;
t.t1 = rand();
t.t2 = rand();
t.t3 = rand();
writer << t;
}
writer.finish();
//Sort the vector
stxxl::sort(vector.begin(), vector.end(), cmp(), 1024*1024*1024);
std::cout << vector.size() << std::endl;
}
实际上,在执行此程序期间似乎只有一个或最多两个线程正在工作。请注意,机器只有一个磁盘。
请告诉我,并行性是否适用于macos?如果没有,那么我将尝试使用linux来看看会发生什么。或者也许是因为只有一个磁盘?
答案 0 :(得分:1)
原则上你正在做的事情应该是开箱即用的。随着一切正常,您应该看到所有核心正在处理。
由于它不起作用,我们必须找到错误,并调试为什么我们看到没有并行加速这些天仍然是棘手的业务。
主要思想是从小到大的例子:
这是什么平台? MSVC上没有并行性,仅在Linux / gcc上。
默认情况下,STXXL使用USE_GNU_PARALLEL构建在Linux / gcc上。您可以将其关闭以查看它是否有效。
尝试复制http://stxxl.sourceforge.net/tags/master/stxxl_tool.html中显示的示例值 - 包含和不包含USE_GNU_PARALLEL
查看处理器/系统中是否只是内存并行排序。