所谓的性能分析单元就是位于同一个并行区的两个相邻同步点之间的代码段。
具体分析略,有兴趣可以深入交流。
对于下面这样的程序,
#include <stdio.h>
#include <omp.h>
#include <math.h>
#define N 100000
int main()
{
int i,j;
int a[N],b[N];
double sum1=0.0,sum2=0.0;
for(i=0;i<N;i++)
{
a[i]=i+1;
b[i]=i+1;
}
#pragma omp inst init
#pragma omp parallel
{
#pragma omp single nowait
{
for(i=0;i<N;i++)
{
sum1+=log(a[i]);
}
}
#pragma omp for
for(j=0;j<N;j++)
{
sum2+=log(b[j]);
}
}
printf("%lf %lf\n",sum1,sum2);
return 0;
}
通过我写的性能分析工具,得到如下的性能日志。
Region:1 name:parallel Line:17-31
Tid exeC exeT exitBarC exitBarT
startupC startupT shutdownC shutdownT
0 1 0.001603 1 0.000021
1 0.000020 1 0.000066
1 1 0.001513 1 0.000021
1 0.000025 1 0.000065
sum 2 0.003116 2 0.000042
2 0.000045 2 0.000131
imbalance_in_parallel_region
severity:0.000406
Region:2 name:single Line:19-25
Tid exeC exeT singleC singleT exitBarC exitBarT
0 1 0.000008 0 0.000000 0 0.000000
1 1 0.000738 1 0.000725 0 0.000000
sum 2 0.000746 1 0.000725 0 0.000000
Region:3 name:for Line:26-30
Tid exeC exeT exitBarC exitBarT
0 1 0.001121 1 0.000697
1 1 0.000393 1 0.000024
sum 2 0.001514 2 0.000721
imbalance_in_parallel_loop
severity:0.006984
如果仅仅观察区域3,发现存在着较严重的负载不均衡情况,0号线程负责较多的工作,而1号线程负责较少的工作,其实这种情况是因为1号线程执行了上面的single区域,又因为single指导命令有nowait从句,所以0号线程没有在single指导命令结束处等待,而是直接执行下面的for指导命令。
其实两个线程是负载均衡的。


档案
日志
相册
视频



评论
想第一时间抢沙发么?