我获得了一个文本文件作为输入,在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;
}
答案 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.
现在,您可以像在单线程区域中那样逐步进行操作。