如何在openMP和并行编程中使用GDB?

3
我被分配一个包含100万条0至9之间的记录的文本文件作为输入。每个记录对应于一个国家公民对候选人的一票。我被要求将文件读入一个序列,然后确定谁赢得了竞赛。我被要求同时使用并行和非并行编程来完成这个任务。我的并行函数(pCounter)不能工作,我正在尝试理解为什么,但是我无法在openMP中运行GDB。当我希望它“步进”时,它只是在函数上“继续”执行。有人知道我如何在openMP和并行编程中使用GDB吗?
编辑:当我尝试逐步执行一个并行函数时,我得到了以下结果:
[New Thread 0x7ffff619e700 (LWP 11152)]
[New Thread 0x7ffff599d700 (LWP 11153)]
[New Thread 0x7ffff519c700 (LWP 11154)]

编译器命令行: g++ -g homework_5_1.cpp -o hw51 -std=c++11 -fopenmp

代码:

void sCounter(myint *x, myint len){
  myint candidates[10];
  for(int i=0; i<10; ++i){
    candidates[i]=0;
  }
  for(int i=0; i<len; ++i){
    candidates[x[i]]+=1;
  }
  int winner=0;
  for(int i=0; i<10; ++i){
    if(i==winner)
      ++i;
    if(candidates[i]>candidates[winner]){
      winner=i;
      i=0;
    }
  }
  cout<<"The winner is candidate "<<winner<<endl;
  for(int i=0; i<10; i++){
    cout<<candidates[i]<<" ";
  }
  cout<<endl;
  int sum=0;
  for(int i=0; i<10; ++i){
    sum+=candidates[i];
  }
  cout<<sum<<endl;
}

void pCounter(myint *x, myint len){
  myint numberOfThreads;
  myint candidates[10];
  for(int i=0; i<10; ++i){
    candidates[i]=0;
  }
  int winner=0;
  #pragma omp parallel
  {
    #pragma omp for
    for(int i=0; i<len; ++i){
      candidates[x[i]]+=1;
    }
    #pragma omp for
    for(int i=0; i<10; ++i){
      if(i==winner)
        ++i;
      if(candidates[i]>candidates[winner]){
        winner=i;
        i=0;
      }
    }
  }
  cout<<"The winner is candidate "<<winner<<endl;
  for(int i=0; i<10; i++){
    cout<<candidates[i]<<" ";
  }
  cout<<endl;
  int sum=0;
  for(int i=0; i<10; ++i){
    sum+=candidates[i];
  }
  cout<<sum<<endl;
}

1
在哪个操作系统上,使用哪种实现的OpenMP? - Basile Starynkevitch
我使用的是Ubuntu 16.04,但我不太确定。当我使用C++时,我会在顶部写上#include<omp.h>。 - Big Boss
描述太过模糊!请包含您的编译器行以及使用 gdb 的尝试记录。通常,gdb 在 OpenMP 程序中可以正常工作。 - Zulan
@Zulan 我刚刚对上面的内容进行了一些编辑,以回答你的请求。当总票数打印出来时,只有大约725,000张选票。我不确定如何处理调试,因为我以前从未使用过OpenMP。 - Big Boss
2
在开始调试之前,将所有并行区域内的变量根据其使用情况标记为“共享”或“私有”,这是明智的时间利用。个人认为,在通过肉眼消除所有竞争条件之前,不要使用调试器。 - High Performance Mark
1个回答

0

要逐步执行代码的并行部分,请使用断点命令到达并行区域的起始位置。

语法如下:

b <filename>:<linenumber>

当您开始gdb会话后,请输入上述命令,然后在接下来的问题中提示“y”:

No source file named <filename>.
Make breakpoint pending on future shared library load? (y or [n])

现在通过输入“r”来运行您的代码。

一旦您的代码到达断点,它应该从以下行开始:

Thread 8 hit Breakpoint 1.

现在你可以像在单线程区域中一样逐步执行它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接