OpenMP - 在执行期间挂起

OpenMP - Hanging during execution

本文关键字:挂起 执行期 OpenMP      更新时间:2023-10-16

我遇到了使用 OpenMP 并行化的程序行为不一致的情况。

当我运行它时,它会打印出其当前阶段,因此预期的输出为:"2 3 4 5"等。前几级之间的时间通常为 1 到 2 秒(在 4 个内核上并行运行时)。

但是,在不重新编译或更改任何内容的情况下,有时当我运行软件时,它会在打印2后立即挂起(在执行第一个并行代码之前打印);

不会变慢,它实际上会停止计算。我已经在 gdb 下运行了它,并确认它挂在 OpenMP 中:

(由于超线程,线程超过 4 个)

[New Thread 0x7ffff6c78700 (LWP 25878)]
[New Thread 0x7ffff6477700 (LWP 25879)]
[New Thread 0x7ffff5c76700 (LWP 25880)]
[New Thread 0x7ffff5475700 (LWP 25881)]
[New Thread 0x7ffff4c74700 (LWP 25882)]
[New Thread 0x7ffff4473700 (LWP 25883)]
[New Thread 0x7ffff3c72700 (LWP 25884)]
^C
Program received signal SIGINT, Interrupt.
0x00007ffff7641fd4 in ?? () from /usr/lib/libgomp.so.1
(gdb) up
#1  0x00007ffff7640a9e in ?? () from /usr/lib/libgomp.so.1
(gdb) 
#2  0x0000000000408ae8 in Redcraft::createStructures (this=0x7fffffffd8d0) at source/redcraft.cpp:512
512 #pragma omp parallel for private(node)

最初pragma指定schedule(dynamic),但拥有或删除它不会改变此挂断的一致性。最后,我尝试启用/禁用omp_set_dynamic(),但也没有效果。

有什么调试建议吗?

这通常发生在数据竞争时。您必须发布正在并行化的代码块。基本上要找出的是线程如何使用数据。在不编译的情况下重新运行并不能保证相同的线程执行顺序,因此会出现此类问题。您是否正在处理文件?在重新运行之前,您必须关闭它们。