c++ - OpenMP 并行化停止工作

标签 c++ c openmp anjuta

在 linux 上,AMD 8 核处理器,使用 g++ 4 7.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-config。 OpemMP 没有 pkg​​-config .pc 文件,所以我为 libgomp 库制作了一个。我将 -lgomp 添加到 Libs: 中,效果很好,并将 -fopenmp 添加到 Libs: 和 Cflags: 中,效果不佳。

出于某种原因,-fopenmp 被添加到名为 -DPACKAGE_SRC_DIR 的命令行参数中(在其引用的值内 - 请参阅原始消息中的编辑),因此被链接器和编译器忽略。我会在 Anjuta 论坛上问这个问题。

因此,解决方案是将其从 .pc 文件中删除,然后将其手动添加到项目参数中,作为 'CXXFLAGS=-fopenmp' 'LDFLAGS=-fopenmp'(我想下次肯定会避免这种情况)会忘记做的:)

无论如何,它是这样工作的。感谢您的建议。

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

相关文章:

c - 如何在 C 中将 uint32 转换为 uint64?

c - 在动态 DLL 中使用线程私有(private)变量?

C++ signed 转换为 unsigned ,为什么这样?

c++ - 绕过 C++ 中的复合文字以删除警告

c++ - 等待多个事件 C++

c++ - 在 C++ 中刷新组合框?

比较 C 字符串与字符串指针的相等性

c - unsafePerformIO 和 FFI 库初始化

python - 如何在cython中使用并行性

multithreading - 创建的线程数为12,但仍只能在12个核心CPU的一个核心上运行