OpenMP并行化已停止工作
OpenMP parallelization stopped working
在linux上,AMD 8核处理器,使用g++4 7.1。
对我来说,这是一个头巾。下面的代码运行得很好,由于某种原因停止了并行化。我添加了omp_get_num_procs(),它打印了8个处理器。我检查了编译,-fopenmp作为链接和编译选项都存在。没有编译/链接错误消息。我检查了是否定义了任何环境变量(OMP_xx)——没有。
是否还有其他外部因素可能影响?
#pragma omp parallel
{
lightray ray;
rgba L;
printf("Max nr processors: %dn", 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 %fn", 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中添加了-lcomp,结果很好,在Libs和Cflags:中都添加了-fopenmp,结果不太好。
出于某种原因,-fopenmp被添加到名为-DPACKAGE_SRC_DIR的命令行参数中(在其引用的值内-请参阅原始消息中的编辑),因此被链接器和编译器忽略。我会在安居塔论坛上问这个问题。
因此,解决方案是将其从.pc文件中删除,并将其手动添加到项目参数中,如"CXXFLAGS=-fopenmp"LDFLAGS=-fopenmp"(我想避免这种情况,因为下次我肯定会忘记这样做:)
不管怎样,它是这样工作的。谢谢你的建议。
尝试以这种方式重写:
lightray ray;
rgba L;
printf("Max nr processors: %dn", omp_get_num_procs());
#pragma omp parallel for schedule(dynamic) private(ray,L)
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 %fn", dtime);
通过这种方式,您引入ray
和L
作为特定于组成循环的每个线程标记的变量。由于在并行区域之外定义的变量默认情况下在线程之间共享,因此您当前的实现将这两个变量混合在一起。
此外,omp_get_num_procs()
"返回程序可用的处理器数量。"根据OpenMP API 3.1 C/C++语法快速参考卡,因此它不一定会告诉你在一个区域中实际使用了多少线程。为此,您可能需要omp_get_num_threads()
或omp_get_thread_num()
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- Visual Studio 2017 停止工作,并在打开后显示许多控制台窗口
- 自 Windows 10 20H1 以来,具有单独线程的多个窗口停止工作
- 如何使用 OpenMP 并行化最近邻搜索
- C++代码停止工作错误使用cout内部函数
- Malloc 在使用线程并行化 SSH 调用时存在问题
- LoadImage 在 Windows 更新后停止工作
- C++程序工作,但 Windows 显示"程序.exe已停止工作"
- VS 代码 C/C++ 智能感知在更新后停止工作
- 不使用与左右停止工作命名空间 std 的简单比较
- 如何使用 OpenMP 正确并行化 for 循环?
- 如何将矩阵的行随机复制到内存中的另一个矩阵的过程并行化?
- C++参数化构造函数使代码在传递大输入时停止工作
- OpenMP并行化已停止工作
- WM_PAINT在最小化并恢复窗口后停止工作
- 为什么我的复制列表初始化停止工作后,我添加继承
- 简单的程序不工作后并行化
- 如何在原生c++中并行化简单的for循环,使其在visual studio 2010 express中工作