在linux上,AMD8核处理器,使用g++47.1。
对我来说,这是个头炮。下面的代码运行得很好,并且由于某种原因停止了并行化。我添加了omp_get_num_procs(),它打印了8个处理器。我检查了编译器,并且-fopenmp作为链接和编译选项出现。没有编译/链接错误消息。我检查是否定义了任何环境变量(OMP_xxx)-没有。
有没有其他外部因素可以影响?

#pragma omp parallel
{
  lightray ray;
  rgba L;
  printf("Max nr processors: %d\n", omp_get_num_procs());

  #pragma omp for schedule(dynamic)
  for (int xy = 0; xy < xy_range; xy++) {
    int x = x_from + (xy % x_width);
    int y = y_from + (xy / x_width);
    ray = cam->get_ray_at(x, y);
    L = trace_ray(ray, 0, cam->inter);
    cam->set_pixel(x, y, L);
  }
}
dtime = omp_get_wtime() - dtime;
printf("time %f\n", dtime);
}

编辑:我想我在这里找到了一些东西。。。由Anjuta生成的g++命令行包含以下内容:
-DPACKAGE_LOCALE_DIR=\""/usr/local/share/locale"\" -DPACKAGE_SRC_DIR=\"".. -fopenmp  . "\"

PACKAGE_SRC_DIR定义似乎“包含”了-fopenmp标志,该标志将对g++隐藏。还没找到原因。。。

最佳答案

这似乎是程序外部的问题。我确实改变了IDE版本(Anjuta)。Anjuta非常依赖pkg配置。OpemMP没有pkg config.pc文件,所以我为libgomp库制作了一个。我在Libs中添加了-lgomp:which go fine,在Libs和Cflags中添加了-fopenmp:which do not go well。
出于某种原因,-fopenmp被添加到名为-DPACKAGE_SRC_DIR的命令行参数中(在其引用的值内-请参阅原始消息中的编辑),因此被链接器和编译器忽略。我会在Anjuta论坛上问这个。
所以,解决方案是将其从.pc文件中删除,并将其手动添加到项目参数中,如“CXXFLAGS=-fopenmp”“LDFLAGS=-fopenmp”(我希望在下次忘记这样做时避免这样做:)
不管怎样,它是这样工作的。谢谢你的建议。

关于c++ - OpenMP并行化停止工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20075206/

10-11 16:11