与openMP并行化 - 堆栈或堆变量

时间:2012-04-16 13:14:42

标签: c++ multithreading stack openmp

我有一个可行的并行化解决方案。但是,并行化可以极大地提高执行时间。我认为它来自我新的事实并删除循环中的一些变量。我希望它是堆栈创建的,但是Command类是抽象的,并且必须保持抽象。我该怎么做才能解决这个问题?如何改善在这些非常长的循环上花费的时间???

#pragma omp parallel for  reduction(+:functionEvaluation)
for (int i=rowStart;i<rowEnd+1;i++)
{
    Model model_(varModel_);
    model_.addVariable("i", i);
    model_.addVariable("j", 1);
    Command* command_ = formulaCommand->duplicate(&model_);
    functionEvaluation += command_->execute().toDouble();
    delete command_;
}

问题也可能在其他地方!建议欢迎!!

感谢和问候。

2 个答案:

答案 0 :(得分:1)

您可能想要使用private or firstprivate clauses

您的#pragma将包含...private(varModel, formulaCommand)...或类似内容,然后每个帖子都有自己的变量副本。使用firstprivate将确保特定于线程的变量具有复制的初始值,而不是未初始化。这将消除对newdelete的需要,假设您可以只修改每个循环迭代的实例。

这可能会或可能不会按预期工作,因为您没有提供很多细节。

答案 1 :(得分:1)

我认为你应该尝试使用一种机制来重用已分配的内存。你可能不知道Command对象的大小和对齐方式,所以&#34;足够大&#34;缓冲是不够的。我让你的duplicate方法有两个参数,第二个是对boost::pool的引用。如果池对象足够大,只需在其中构造新的Command对象,如果它没有展开它,并构造成它。 boost::pool会为您处理对齐问题,因此您不必考虑它。这样,您每个线程只需要进行几次动态内存分配。

顺便说一下,在C ++中返回原始指针通常不是一个好习惯。使用智能指针,它只是更好的方式,没有任何问题...嗯,有一个但是在这种情况下:),因为根据我的建议,你做了一些引擎盖定制内存管理。尽管如此,最好的做法是编写一个自定义智能指针,优雅地处理您的特殊情况,而不会让用户感到困扰。你当然可以像其他人一样做,并在这种情况下做例外:)(我的建议在正常情况下仍然存在,但在上面的问题f.x.,你通常应该使用类似boost::scoped_ptr的东西)