如何并行使用boost?

时间:2012-10-08 15:45:47

标签: c++ multithreading boost

为了优化我正在制作的某些库的执行,我必须并行化一些计算。 不幸的是,我不能使用openmp,所以我试图使用boost :: thread做一些类似的替代。 有人知道这样的一些实现吗? 我在线程之间共享变量时遇到了特殊问题(将变量定义为openmp的'shared'和'pribate')。任何sugestions?

1 个答案:

答案 0 :(得分:4)

据我所知,除了OpenMP之外,你必须明确地做这件事。

作为示例,如果我们在OpenMP中有一个并行化循环

int i;
size_t length = 10000;
int someArray[] = new int[length];

#pragma omp parallel private(i)
{

    #pragma omp for schedule(dynamic, 8)
    for (i = 0; i < length; ++i) {

        someArray[i] = i*i;

    }
}

您必须将逻辑分解为可以在问题的子范围内工作的“通用”循环,然后显式调度线程。然后,每个线程将处理整个问题的一部分。通过这种方式,您可以显式声明“私有”变量 - 进入subProblem函数的变量。

void subProblem(int* someArray, size_t startIndex, size_t subLength) {
    size_t end = startIndex+subLength;

    for (size_t i = startIndex; i < end; ++i) {
        someArray[i] = i*i;         
    }
}

void algorithm() {

    size_t i;
    size_t length = 10000;
    int someArray[] = new int[length];
    int numThreads = 4; // how to subdivide
    int thread = 0;

    // a vector of all threads working on the problem
    std::vector<boost::thread> threadVector;

    for(thread = 0; thread < numThreads; ++thread) {
        // size of subproblem
        size_t subLength = length / numThreads;
        size_t startIndex = subLength*thread;

        // use move semantics to create a thread in the vector
        // requires c++11. If you can't use c++11,
        // perhaps look at boost::move?
        threadVector.emplace(boost::bind(subProblem, someArray, startIndex, subLength));            
    }
    // threads are now working on subproblems

    // now go through the thread vector and join with the threads.
    // left as an exercise :P

}

以上是许多调度算法中的一种 - 它只是将问题切割成与线程一样多的块。

OpenMP方式更复杂 - 它将问题分解为许多小块(在我的示例中为8),然后使用工作窃取调度将这些块提供给线程池中的线程。实现OpenMP方式的难点在于,您需要等待工作的“持久”线程(线程池)。希望这是有道理的。

更简单的方法是在每次迭代时进行异步(为每次迭代调度一项工作)。如果每次迭代非常昂贵并且需要很长时间,这可以工作。但是,如果它是MANY迭代的小部分工作,大部分开销将进入调度和线程创建,使并行化无用。

总之,根据您的问题,有许多方式来安排工作,您可以找出最适合您问题的方法。

<强> TL; DR: 如果您提供“子范围”功能,请尝试为您安排的英特尔线程构建模块(或Microsoft PPL):

http://cache-www.intel.com/cd/00/00/30/11/301132_301132.pdf#page=14