for循环中的OpenMP线程安全性

时间:2014-07-10 16:02:20

标签: c++ thread-safety openmp

我正在尝试并行化使用OpenMP在遗传算法中运行的for循环并遇到段错误,并且我假设它存在线程安全问题。

我不清楚,也许可能是我对C ++线程缺乏了解,因为我可以看到变量之间不应该存在任何串扰。

作为参考,这是我并行化的循环:

void GA::evaluate(double cfgNRG, double cfgNA, double cfgAC)
{
  // Evaluate individuals in the population:
  #pragma omp parallel num_threads(3)
  {
    #pragma omp for
    for(unsigned int indv = 0; indv < population_.size(); ++indv)
    {
      std::cout << "Individual [" << indv << "]" << std::endl;
      // Retrieve the individual:
      Genome& genome = population_[indv];

      // Have we already evaluated this individual?
      if(genome.is_evaluated()) {
          continue;
      }

      // Evaluate individual:
      {
        GA::SimulationResults results = evaluate(genome, cfgNRG, cfgNA, cfgAC);
        genome.set_trace(results.first);
        genome.set_fitness(results.second);
      }
    }
  }

  // Sort the population:
  sort_population();
}

问题出在内部evaluate函数中。但是,唯一作用的变量是从genome向量中拉出的population_变量。我原以为在单个变量上运行(在for循环结束之前不与任何其他东西交互)将是线程安全的,然而,我收到了段错误。如果我将evaluate函数定义为关键,那么程序就可以正常工作(而且,程序运行正常而无需并行化)。

我的一个想法是线程在循环结束时没有被连接,但是根据documentation,在parallel声明之后,连接应该自动发生在右大括号上。

0 个答案:

没有答案