如何修复 OpenMP 程序的 gdb 运行中的线程数

Posted

技术标签:

【中文标题】如何修复 OpenMP 程序的 gdb 运行中的线程数【英文标题】:How to fix number of threads in gdb run of an OpenMP program 【发布时间】:2018-06-06 15:04:24 【问题描述】:

我正在尝试在 Mac OSX 机器上使用 gdb 调试 OpenMP C++ 程序。 (好吧,从技术上讲,使用“ggdb”。)无论我将 OMP_NUM_THREADS 设置为什么,gdb 都会尝试在 8 个线程上运行代码。为什么是这样?有没有办法让我自己告诉它代码将运行的线程数?

【问题讨论】:

向我们展示代码,至少是如何定义并行部分。线程数可以通过多种方式设置,其中一些优先级高于OMP_NUM_THREADS 不使用gdb的线程数是多少? @ks1322 在没有调试器的情况下运行,线程数是我设置的 OMP_NUM_THREADS 。目前,我只想在两个上运行它。 在调试器中运行时如何设置OMP_NUM_THREADS?你的机器上有多少个内核/硬件线程? @DanielLangr 好吧,我想我是在显示我的无知,但我在启动调试器之前设置了它。我应该在调试器中做吗?不知道怎么弄。 【参考方案1】:

好吧,我想我是在显示我的无知,但我是在我之前设置的 启动调试器。我应该在调试器中进行吗?

你应该在gdb里面设置环境变量OMP_NUM_THREADS

(gdb) set environment OMP_NUM_THREADS 2

另见内置帮助:

(gdb) help set environment 
Set environment variable value to give the program.
Arguments are VAR VALUE where VAR is variable name and VALUE is value.
VALUES of environment variables are uninterpreted strings.
This does not affect the program until the next "run" command.

【讨论】:

以上是关于如何修复 OpenMP 程序的 gdb 运行中的线程数的主要内容,如果未能解决你的问题,请参考以下文章

OpenMP 中的分析/调试 - Linux 和免费?

如何让 OpenMP 在程序每次运行时只创建一次线程?

使用 gdb 调试多线程代码但无法访问私有变量?

修复 C++ 中的分段错误

使用 OpenMP 并行化 C 中的基数排序

在docker中使用gdb调试程序