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 看看会发生什么。或者可能是因为只有一个磁盘?