堆栈或堆变量

我有一个并行化的工作解决方案。 但是,执行时间通过并行化得到很小的改进。 我认为它来自我新的事实,并删除循环中的一些变量。 我希望它是堆栈创建的,但是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_;
}

这个问题也可能在别处! 建议欢迎!

感谢致敬。


你可能想要玩privatefirstprivate子句。

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

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


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

顺便说一下,在C ++中返回原始指针通常不是很好的做法。 使用智能指针代替它,只是没有任何buts而言更好......嗯,在这种情况下有一个:),因为在我的建议下,你会在引导下进行一些自定义内存管理。 尽管如此,最好的做法是编写一个自定义的智能指针,它可以优雅地处理您的特殊情况,而不会冒用户冒险。 你当然可以像其他人那样做,并在这种情况下做出例外:)(我的建议仍然在正常情况下,虽然,在上面的问题fx,你通常应该使用像boost::scoped_ptr

链接地址: http://www.djcxy.com/p/79259.html

上一篇: stack or heap variables

下一篇: Use stack or heap for MPI program variables