OpenMP的原理?

故事是这样的..前几天,投了腾讯的游戏客户端开发..面试官看了我的简历,问了我OpenMP的原理?然后一面就挂了(当然还有其他问题,总之不够钻研,没有达到预期!)于是乎在图书馆找了本有关OpenMP的书看看。

OpenMP是一个顶层的并行框架,其内部兼容各种各样的线程库。具体的其将并行域交给ORT来负责,把并且隔离了具体使用的线程库。当然从编译原理的角度需要先将OpenMP的语法制导转化成C语言,再由GCC编译。ORT和EELIB的框架如下图所示:

线程管理和控制

通过线程池和EECB共同维护一个高效的并行域管理。

线程池

为了避免每次进入和退出并行域所使用的fork-join操作,OMPi实际维护了一个线程池,需要时将线程从池中取出。具体是下图所示,这里采用othr_pool_t的类型来记录,是一条单向链表,同时* H是头执政,plen标识总用共有plen个线程,plock作为访问线程池的互斥锁。注意这里的arg并非函数的arg,而是当前线程运行的EECB((Execution Entity Control Block)控制块参数。取用是,从线程池的头部一个一个取下。

EECB

EECB很大程度上实现了线程的层次关系,包括线程组和线程嵌套关系。 其中重要的几个参数有,level表示的是线程的层次结构,sibling表示同层次的线程到底有几个,parent即指向父节点的线程(有可能是自己)。

任务分担–For

`#pragma omp parallel for`非常常用,有static,dynamic,guide,默认和runtime五种调度方式。默认模式是一种特殊的静态调度,没有指定chunksize。当然书中还有section single等,但是for是最常用的。
static的例子图下图所示:

还有很多具体的操作实现包括编译原理,AST结构的变化,共享变量,私有变量,规约的实现等等,ORT具体底层实现的EECB等等,具体可以参考OpenMP编译原理及实现技术。这可能是国内第一本有关OpenMP实现的书了(而中文互联网上也几乎没有关于OpenMP底层原理的内容..

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注