2

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

4

1 回答 1

1

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

由于它不起作用,我们必须找到错误,并且调试为什么我们没有看到并行加速现在仍然是一件棘手的事情。

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

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

  • 默认情况下 STXXL 在 Linux/gcc 上使用 USE_GNU_PARALLEL 构建。你可以关掉看看有没有效果。

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

  • 看看您的处理器/系统上是否仅在内存中进行并行排序。

于 2014-01-27T08:56:05.350 回答