OpenMP: OpenMP任务划分与调度

       这一片介绍OpenMP的任务划分与调度,还是以代码说明。关于任务划分和调度的介绍这里也省略了。

// distribute tasks.cpp : 定义控制台应用程序的入口点。 // #include <stdio.h> #include <omp.h>

int main(int argc, char* argv[]) {  const int N = 20;  int a[N] = {0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9};  int b[N] = {0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9};  int c[N];

/*  工作量的划分与调度有3种方式:  1、静态:schedule (static [,chunk]),比较适合每次迭代的工作量相近(主要指工作所需时间)的情况。     把循环的迭代按照每x次(x=chunk)迭代分为一块,这样你的总工作量就被划分成了n/x块(n为迭代次数、循环次数),     然后将这些块按照轮转法依次分配给各个线程。举个例子:比如我们有100次迭代,     x=chunk=4,那么我们的工作就被分为25块,假设我们有2个线程可以做工作,那么线程1分到的块是     1,3,5,7....,25,线程2分到的块是2,4,6,...,24;

 2、动态:schedule (dynamic [,chunk]),比较适合每次迭代的工作量非常不确定的情况。     迭代分块方法同上,但是工作块被放到一个队列中,每个线程每次拿一块,做好了才能到队列里去拿下一块;

 3、Guided:schedule (guided [,chunk]),类似动态方式,但是队列相关的开销会比动态方式小     这个方式是动态方式的改进。在这个方式里,分块的x是不固定的,一开始块的大小(x)比较大,随着剩余工作量的减小,     块的大小也随之变小。

 4、实时:schedule (runtime [,chunk]),根据系统设置来定。 */

 printf("\n------------------------ 系统分配任务,static --------------------------\n"); #pragma omp parallel for schedule(static, 3) // 每一块是3个任务,块按照轮转法依次分配给各个线程,一次性分配完  for(int i=0;i<N;i++)  {   c[i] = a[i] + b[i];   printf("threadnum=%d, c[%d]=%d\n", omp_get_thread_num(), i, c[i]);  }

 for (int i=0;i<N;i++)  {    printf("c[%d]=%d\t", i, c[i]);   c[i] = 0;  }

 printf("\n------------------------ 系统分配任务,dynamic -------------------------\n"); #pragma omp parallel for schedule(dynamic, 3)  // 每一块是3个任务,有个任务块队列,线程每一次从队列里获取一个任务块,执行完再取下一个,所  // 以获得的块号是无序的  for(int i=0;i<N;i++)  {   c[i] = a[i] + b[i];   printf("threadnum=%d, c[%d]=%d\n", omp_get_thread_num(), i, c[i]);  }

 for (int i=0;i<N;i++)  {    printf("c[%d]=%d\t", i, c[i]);   c[i] = 0;  }

 printf("\n------------------------ 系统分配任务,guided --------------------------\n"); #pragma omp parallel for schedule(guided, 3)  // 每一块是3个任务,有个任务块队列,随着任务的减少,块的大小也在减小  for(int i=0;i<N;i++)  {   c[i] = a[i] + b[i];   printf("threadnum=%d, c[%d]=%d\n", omp_get_thread_num(), i, c[i]);  }

 for (int i=0;i<N;i++)  {    printf("c[%d]=%d\t", i, c[i]);   c[i] = 0;  }

/* 自己手动分配任务(类似与划分与调度策略的static,轮转分配) *  第一种是每个线程分配的块里的任务是连续的, id*(N/Nthrds)-->(id+1) * (N / Nthrds); *  第二种每个线程分配的块里的任务是分散的,第id个,第id+Nthrrds个,第id+2*Nthrds。。。只到

id+m*Nthrds>=N,。 *  这两种思想的区别值得借鉴。 */   // 方法一   printf("\n------------------------ 手动分配任务,方法一 ------------------\n"); #pragma omp parallel  {   int i, istart, iend;   int Nthrds = omp_get_num_threads(), id = omp_get_thread_num();   if (N/Nthrds == 0)   {    istart = id * (N / Nthrds);  // 每个线程都完成N/Nthrds个任务,就是将N个任务平均分给Nthrds个线程,最后一个线程可能不足 // N/Nthrds个任务    iend = (id+1) * (N / Nthrds);   }   else{    istart = id * (N/Nthrds + 1); // 每个线程都完成N/Nthrds + 1个任务,最后一个线程可能不足N/Nthrds + 1个任务。或者可以每个线 // 程完成N/Nthrds个,最后一个线程多完成剩余的    iend = (id+1) * (N/Nthrds + 1);   }      for(i=istart; i<iend && i<N; i++)   {    c[i] = a[i] + b[i];    printf("threadnum=%d, c[%d]=%d\n", id, i, c[i]);   }  }  for (int i=0;i<N;i++)  {    printf("c[%d]=%d\t", i, c[i]);   c[i] = 0;  }    printf("\n------------------------ 手动分配任务,方法二 -------------------------\n"); // 方法二 #pragma omp parallel  {   int i, istart, iend;   int Nthrds = omp_get_num_threads(), id = omp_get_thread_num();   iend = N;   for(i=id; i<iend; i+=Nthrds) // 每个线程一次完成第id个任务,第id+Nthrrds个,第id+2*Nthrds。。。只到id+m*Nthrds>=N   {    c[i] = a[i] + b[i];    printf("threadnum=%d, c[%d]=%d\n", id, i, c[i]);   }  }

 for (int i=0;i<N;i++)  {    printf("c[%d]=%d\t", i, c[i]);   c[i] = 0;  }

 return 0; }

下面是输出,系统设置为2个线程

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MPI和OpenMP是两种常见的并行程序设计模型,用于实现并行计算。 MPI,全称为Message Passing Interface,是一种消息传递接口,适用于分布式内存系统下的并行计算。MPI程序由多个进程组成,每个进程拥有自己的独立内存空间,它们通过消息传递来进行通信和同步。MPI程序可以在不同的计算节点上运行,通过网络传输消息。 OpenMP是一种共享内存的并行编程模型,适用于多核系统和共享内存架构。OpenMP程序使用线程来并行执行任务,线程之间可以访问共享内存。OpenMP程序在单个计算节点上运行,并利用线程的方式实现任务的并行执行。 C语言是一种高级编程语言,非常适合并行程序设计。C语言提供了丰富的并行编程库和函数,例如MPI和OpenMP。MPI和OpenMP可以与C语言结合使用,实现并行计算。 在MPI和OpenMP并行程序设计的C语言版PDF中,我们可以学习如何使用C语言编写MPI和OpenMP程序。该PDF将详细介绍MPI和OpenMP的概念、语法和函数,以及如何在C语言中实现并行计算。通过学习该PDF,我们可以掌握使用C语言编写高效的并行程序的技巧和方法。 总之,MPI和OpenMP是两种常见的并行程序设计模型,适用于不同类型的并行计算环境。在C语言版的MPI和OpenMP并行程序设计PDF中,我们可以学习如何使用C语言编写MPI和OpenMP程序,从而实现高效的并行计算。 ### 回答2: 《MPI与OpenMP并行程序设计:C语言版》是一本以C语言为基础,介绍MPI和OpenMP并行程序设计的教材。MPI(Message Passing Interface)是一种消息传递接口,用于实现并行计算中不同节点之间的数据传递和通信。而OpenMP是一种共享内存并行编程模型,通过在代码中插入指令来实现并行化。 这本教材首先介绍了MPI和OpenMP的基本概念和工作原理。它详细讲解了MPI的通信操作和数据类型,在编写并行程序时如何使用MPI函数进行进程之间的通信。同时也介绍了OpenMP的指令和语法,以及如何在C语言程序中使用OpenMP进行多线程并行计算。 教材还特别强调了MPI和OpenMP的结合使用。它介绍了如何在一个程序中同时使用MPI和OpenMP,使得程序既能进行跨节点的并行计算,又能在每个节点的多个处理器中进行并行计算。这种结合使用可以充分发挥集群计算机的计算能力,提高程序的运行效率。 此外,教材还提供了大量的例子和实践操作,帮助读者理解并掌握MPI和OpenMP的并行程序设计。通过实践操作,读者可以学会如何在C语言中使用MPI和OpenMP编写并行程序,体会到并行计算的优势和挑战。 总的来说,《MPI与OpenMP并行程序设计:C语言版》是一本很好的教材,适合想要学习并行程序设计的C语言程序员。它全面介绍了MPI和OpenMP的概念和应用,通过实例和实践操作帮助读者掌握并行计算的基本原理和实现方法。无论是对于学术研究还是实际应用,这本书都是一本很有价值的参考书籍。 ### 回答3: MPI(Message Passing Interface)和OpenMP(Open Multi-Processing)是用于并行程序设计的两种常见的标准。MPI适用于分布式内存计算机集群,而OpenMP适用于共享内存计算机架构。 MPI提供了一套函数接口,允许程序员在多个计算节点上进行并行计算。它允许进程之间通过消息传递来交换数据和同步计算。在MPI中,可以通过创建不同的进程,并通过消息传递进行通信来实现并行计算。这使得程序能够在不同的计算节点上同时运行,从而提高了整体的计算性能。 OpenMP是一套用于共享内存并行编程的指令集,允许程序员通过在代码中添加特定的指令来实现并行计算。OpenMP采用线程并行的方式,允许多个线程同时执行程序的不同部分。在OpenMP编程中,可以通过添加预处理指令来定义并行区域,从而使多个线程同时执行其中的任务。这种方式可以有效地利用计算机的多核处理器,提高程序的执行效率。 MPI和OpenMP在不同的计算环境中起作用。如果要在多个计算节点上进行并行计算,使用MPI会更合适。MPI可以在集群中的多个计算节点之间进行通信,允许分布式计算。如果计算机具有多个核心并且共享内存,那么使用OpenMP可能更合适。OpenMP可以利用计算机的多核处理器来实现并行计算。 总结而言,MPI和OpenMP是用于并行程序设计的常见工具。选择使用哪种工具取决于计算机的架构和需要解决的问题。MPI适用于分布式内存计算机集群,而OpenMP适用于共享内存计算机架构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值