我被分配一个包含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;
}
gdb
的尝试记录。通常,gdb
在 OpenMP 程序中可以正常工作。 - Zulan