1

使用Nsight Eclipse Edition 10.2使用gdb 7.11.1调试纯 C++ 代码。

该代码使用对 OpenMP 的编译指示调用来分叉一个 for 循环。以下是一个最小的工作示例,其中一个简单的数组q填充了另一个变量的值p

#pragma omp parallel for schedule (static)
for(int p=pstart; p<pend; p++){
   const unsigned i = id[p];
   if(start <= i && i < end)
      q[i - start] = p;
}

在调试模式下,我想使用步进函数(经典F5)来跟踪数组如何q填充p's. 但是,这完全跳过了 for 循环,并在并行线程再次加入的地方恢复。

有没有办法强制进入pragma 指令/openMP 循环?

4

1 回答 1

1

有没有办法强制进入 pragma 指令/openMP 循环?

这将取决于调试器,但也不完全清楚这意味着什么。由于许多线程执行并行循环,您会期望它们中的每一个都停止然后一起执行吗?您希望如何显示每个线程的不同状态?(每个都有自己的pand i)。如果线程控制流发散会发生什么?

有一些调试器可以做到这一点(例如 Linux 上的 TotalView),但这并不是一件容易的事(而且 TotalView 需要花钱[这是完全公平合理的 :-)])。

您可能需要做的是在循环内设置一个断点,然后处理它被 N 个线程击中......(这不能回答您的确切问题,但可以让您看到循环中发生了什么,即可能是你真正需要做的!)

于 2020-04-07T10:12:39.310 回答