测试OpenMP的负载均衡,分别采用static,dynamic和schedule

static

SCHEDULE(static, chunk) SCHEDULE(static)

l )循环任务被划分为 chunk 大小的子任务,然后被轮转的分配给各个线程

2)省略 chunk,则循环任务被划分成(近似)相同大小的子任务,每个线程 被分配一个子任务

#include <stdio.h> 
#include <omp.h>  

int main()
{ 
 int m = 10;
 int nthreads, tid, i;
 
 omp_set_num_threads(2);

 // static schedule without size
 printf("\nstatic schedule without size \n");
 #pragma omp parallel for private(i,nthreads,tid) schedule(static)
 for (i = 1; i <= m; i++)
 {
  tid = omp_get_thread_num();
  nthreads = omp_get_num_threads();
  printf("nthreads=%5d, id=%5d, i=%5d\n", nthreads, tid, i);
 }


 // static schedule with size
 printf("\nstatic schedule with size \n");
 #pragma omp parallel for private(i,nthreads,tid) schedule(static,2)
 for (i = 1; i <= m; i++)
 {
  tid = omp_get_thread_num();
  nthreads = omp_get_num_threads();
  printf("nthreads=%5d, id=%5d, i=%5d\n", nthreads, tid, i);
 }

return 0; 
}

操作截图:

dynamic:

SCHEDULE(dynamic) SCHEDULE(dynamic, chunk)

l )循环任务被划分为 chunk 大小的子任务,然后基于先来先服务方式分配 给各线程;

2 )当省略 chunk 时,默认值为 1

#include<stdio.h>
#include<omp.h>
main()
{
    int i,j,nthreads,tid;
    omp_set_num_threads(2);
    #pragma omp parallel for private(i,j,nthreads,tid) schedule(dynamic)
    for(i=0;i<10;i++)
    {
        for(j=i;j<10;j++)
        {
            tid = omp_get_thread_num();
              nthreads = omp_get_num_threads();
              printf("nthreads=%5d, id=%5d, i=%5d\n", nthreads, tid, i);
        }
    }
    return 0;
}

操作截图:

观察静态负载平衡,我发现并行工作区域分成多个可并行执行的部分,分割后的计算任务能够较为均衡的分配给不同线程。

关于动态调度,执行较快的线程申请任务的次数就会大于执行较慢的线程。因此,可以较好的解决静态负载平衡所引起的负载不平衡的问题。所以实验中线程0的执行应该比线程1执行的速度快。

posted @ 2017-12-14 19:46  奇热行  阅读(1510)  评论(0)    收藏  举报