c++ - 使用 openMP 进行并行化 - 堆栈或堆变量

标签 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_;
}

问题也可能出在其他地方!欢迎指教!!

感谢和问候。

最佳答案

你可能想玩一下 private or firstprivate clauses .

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

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

关于c++ - 使用 openMP 进行并行化 - 堆栈或堆变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10174862/

相关文章:

c++ - fscanf 的包装功能不起作用

java - Java代码中的奇怪输出(方形符号)

c++ - 使用const char *键映射C++检索null

c++ - c++调试:从控制台调试语句

java - 单例设计模式中的 Synchronized(MyClass.class){ } - 它有什么作用?

c++ - 异步完成处理

java - 为什么 Thread 类不支持克隆方法?

linux - 是否存在读取自身进程的[堆栈]地址范围的函数?

c - stack 未初始化的值是由堆栈分配创建的

c++ - G-WAN cc1plus : error: unrecognized command line option "-std=gnu++0x"