STXXL:排序时有限的并行性?

时间:2014-01-25 15:19:07

标签: sorting stxxl

我使用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来看看会发生什么。或者也许是因为只有一个磁盘?

1 个答案:

答案 0 :(得分:1)

原则上你正在做的事情应该是开箱即用的。随着一切正常,您应该看到所有核心正在处理。

由于它不起作用,我们必须找到错误,并调试为什么我们看到没有并行加速这些天仍然是棘手的业务。

主要思想是从小到大的例子:

  • 这是什么平台? MSVC上没有并行性,仅在Linux / gcc上。

  • 默认情况下,STXXL使用USE_GNU_PARALLEL构建在Linux / gcc上。您可以将其关闭以查看它是否有效。

  • 尝试复制http://stxxl.sourceforge.net/tags/master/stxxl_tool.html中显示的示例值 - 包含和不包含USE_GNU_PARALLEL

  • 查看处理器/系统中是否只是内存并行排序。