使用 openMP 并行化 - 堆栈或堆变量
parallelization with openMP - stack or heap variables
>我有一个并行化的工作解决方案。但是,并行化可以稍微缩短执行时间。我认为它来自我新建并删除循环中的一些变量的事实。我希望它是堆栈创建的,但是命令类是抽象的,并且必须保持抽象。我能做些什么来解决这个问题?如何改善在这些非常长的循环上花费的时间???
#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_;
}
问题也可能出在其他地方! 欢迎建议!!
谢谢和问候。
您可能希望使用private
或firstprivate
子句。
您的#pragma
将包含...private(varModel, formulaCommand)...
或类似变量,然后每个线程都有自己的这些变量副本。使用 firstprivate
将确保特定于线程的变量具有复制的初始值,而不是未初始化。这将消除new
和delete
的需要,假设您可以修改每个循环迭代的实例。
这可能会也可能不会按预期工作,因为您没有提供很多细节。
我认为您应该尝试使用一种机制来重用分配的内存。您可能不知道即将Command
对象的大小或对齐方式,因此"足够大"的缓冲区是不够的。我会让你的duplicate
方法采用两个参数,第二个是对boost::pool
的引用。如果池对象足够大,只需在其中构造新的Command
对象,如果不展开它,则构造到其中。 boost::pool
将为您处理对齐问题,因此您不必考虑它。这样,每个线程只需执行几次动态内存分配。
顺便说一下,在C++中返回原始指针通常不是好的做法。改用智能指针,这样更好,没有任何但是......好吧,有一个但在这种情况下:),因为根据我的建议,您将在引擎盖下进行一些自定义内存管理。不过,最佳做法是编写一个自定义智能指针,该指针可以优雅地处理您的特殊情况,而不会冒着用户搞砸的风险。您当然可以像其他人一样,在这种情况下例外:)(不过,我的建议在正常情况下仍然有效,例如在上面的问题中,您通常应该使用类似 boost::scoped_ptr
的东西)
- 堆栈中大小变量输入错误 (C++)
- 变量周围的堆栈'...'已损坏
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 如果我们通过引用传递变量,则递归中使用的堆栈空间量是否为零?
- 在 c++ 中确定堆栈上的变量范围
- 为什么在堆栈和堆上创建变量会产生相同的程序集代码?
- 为什么弹出我的堆栈会返回垃圾而不是初始变量?
- 堆栈粉碎 在我在代码中添加新变量以及一些操作后C++检测到
- 无法在具有常量变量大小的类中创建堆栈分配数组
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- 堆栈/帧指针作为外部变量
- "new"创建的实例的所有成员变量是否都存在于堆上而不是堆栈上?
- 变量周围的堆栈'sortArray'已损坏
- 堆栈变量超出范围时是否解除分配?
- 变量周围的堆栈'folderPath'已损坏
- 何时在函数中声明堆栈分配变量?
- 运行时检查失败 #2 - 变量周围的堆栈'...'已损坏
- C++ 大于堆栈的变量(堆栈溢出)
- 局部变量堆栈