代码之家  ›  专栏  ›  技术社区  ›  Wookai

工作线程在片刻后停止工作

  •  2
  • Wookai  · 技术社区  · 16 年前

    我有一个使用OpenMP并行化的串行应用程序。我只是在我的主循环中添加了以下内容:

    #pragma omp parallel for default(shared)
    for (int i = 0; i < numberOfEmitters; ++i)
    {
        computeTrajectoryParams* params = new computeTrajectoryParams;
                // defining params...
        outputs[i] = (int*) ComputeTrajectory(params);
    
        delete params;
    }
    

    _vcomp::PersistentThreadFunc 从…起 vcomp90.dll vctools\openmprt\src\ttpool.cpp ),然后是另一个,等等。。。直到只有主线程仍然工作。

    有人知道为什么会这样吗?这在大约一半的迭代已经执行之后开始发生。

    2 回复  |  直到 16 年前
        1
  •  6
  •   Anna    16 年前

    这可能取决于调度方案和每个周期的计算量。 如果调度是静态的,则每个线程在运行之前都分配了工作。每个线程将获得1/4的索引。有可能一些线程比其他线程先完成,因为它们的工作比其他线程更容易(或者可能它们只是装载了更少的其他东西)。

    尝试使用动态调度,看看是否效果更好。

        2
  •  2
  •   Juice    16 年前

    对您的代码没有什么评论:如果您的ComputeProject的执行时间以毫秒为单位,并且您有多个迭代,那么您应该确保您有一个经过MP优化的内存分配器,因为您在每个迭代中进行分配,并且(至今)大多数分配器都有一个带有全局锁的全局池。