【问题标题】:Stepping into a pragma directive with a parallel for loop (C++, OpenMP, Nsight Eclipse IDE)使用并行 for 循环(C++、OpenMP、Nsight Eclipse IDE)进入编译指示指令
【发布时间】:2020-07-19 10:35:25
【问题描述】:

使用 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 填充的。但是,这会完全跳过 for 循环,并从并行线程再次加入的地方继续。

有没有办法强制进入一个编译指示指令/openMP 循环?

【问题讨论】:

    标签: c++ eclipse debugging openmp step-into


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢。大线条清晰。在我的情况下,循环内的断点不会吸引调试器,它会继续跳过 for 循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多