如何将GDB与openMP和并行编程一起使用?

时间:2017-04-23 13:42:18

标签: c++ parallel-processing openmp

我获得了一个文本文件作为输入,在0到9之间有1,000,000个条目。每个条目对应一个国家公民对候选人的投票。我被要求将文件读入一个序列,然后确定谁赢得了比赛。我被要求用并行和非并行编程来做这件事。我的并行函数(pCounter)不起作用,我试图理解为什么,但我不能让GDB在openMP中运行。当我希望它“逐步”通过时,它只是“继续”在功能上。有谁知道如何使用GDB进行openMP和并行编程?

编辑当我尝试单步执行并行函数时,我得到以下结果:

[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 个答案:

答案 0 :(得分:0)

要逐步遍历代码的并行部分,请使用breakpoint命令到达并行区域的开始。

语法如下:

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.

现在,您可以像在单线程区域中那样逐步进行操作。

相关问题