我有一个可行的并行化解决方案。但是,执行时间通过并行化得到了非常非常小的改善。我认为这是因为我在循环中新建和删除了一些变量。我希望它是堆栈创建的,但是 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_;
}
问题也可能出在其他地方!欢迎指教!!
感谢和问候。
最佳答案
你可能想玩一下 private
or firstprivate
clauses .
您的 #pragma
将包含 ...private(varModel, formulaCommand)...
或类似内容,然后每个线程都会有自己的这些变量拷贝。使用 firstprivate
将确保线程特定变量具有复制的初始值,而不是未初始化。这将消除 new
和 delete
的需要,假设您可以为每个循环迭代修改实例。
这可能会或可能不会按预期工作,因为您没有提供很多细节。
关于c++ - 使用 openMP 进行并行化 - 堆栈或堆变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10174862/