测试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执行的速度快。

浙公网安备 33010602011771号