OpenMP - 在执行期间挂起
OpenMP - Hanging during execution
我遇到了使用 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()
,但也没有效果。
有什么调试建议吗?
这通常发生在数据竞争时。您必须发布正在并行化的代码块。基本上要找出的是线程如何使用数据。在不编译的情况下重新运行并不能保证相同的线程执行顺序,因此会出现此类问题。您是否正在处理文件?在重新运行之前,您必须关闭它们。
相关文章:
- 挂起和取消挂起一个文件DLL
- 如何防止C++遗留代码中的挂起指针
- 为什么所有C++编译器都会崩溃或挂起此代码
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 构建挂起,即使是适度的文件大小
- 循环挂起迭代的 std::擦除 on std::list
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- 从不同进程中的另一个线程挂起/恢复线程或进程
- Boost (Beast) websocket:同步写入挂起
- 为什么析构函数挂起
- 使用互斥会挂起程序
- 在C++和 Python 程序中使用命名管道的 IPC 挂起
- 设置变量时C++程序挂起
- 第一次尝试使用new动态创建结构数组,程序挂起没有错误
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 有时ShowWindow从不调用OnShowWindow,主应用程序挂起
- 如何防止GUI挂起,同时允许第二次操作与Qt中的第一次操作一起执行
- WTSFreeMemory在启动期间从服务调用时挂起-我应该省略吗
- C++HTTP客户端在GET请求后挂起read()调用