OpenMP是一种API,是共享存储体系结构的一个并行编程模型,适合SMP共享内存多处理系 统和多核处理器体系结构。1.SMP:共享内存并行机(Shared Memory Processors)2.DSM:分布共享存储并行机(Distributed Shared Memory):NUMA(Nonuniform Memory Access)NUMA体系结构包括Socket(4),Node(2),Core(4),Thread(2)3.OpenMP采用Fork-Join并行执行模型OpenMP程序开始于一个单独的主线程(Master Thread),然后主线程一直串行执行,直到遇到第一个并行域(Parallel Region),然后开始并行执行。过程如下:Fork:主线程创建一个并行线程队列,然后,并行域中的代码在不同的线程上并行执行;Join:当并行域执行完之后,他们或被同步或被终端,最后只有主线程在执行4.CRITICAL(临界段) (保存共享变量)可以保护共享变量的更新,避免数据竞争制导内的代码仅有一个线程执行#pragma omp critical [(name)]*Critical制导在某一时刻仅能被一个线程执行;*Critical制导可用来保护对共享变量的修改;*如果name被省略,一个空(null)的name被假定*使用命名临界段时,应用程序可以有多个临界段5.ATOMIC制导(保存共享变量)*ATOMIC编译制导也可以用来更新共享变量,主要用来保证操作的执行#pragma omp atomicstatement注意:在c/c++中,statement必须是下列形式之一:x binop =expr ,x++,x--,++x,--x(binop是二元操作符:+,-等)*ATOMIC编译指导的好处是允许并行的更新数组内不同的元素,而使用临界值时数组元素的更新是串行的*无论如何,当需要更新共享存储单元的语句中避免数据竞争,应该先使用atomic,然后在用临界段6.制导语句格式:制导标识符 制导名称 【Clause,】如:#pragma omp parallel num_threads(4);7.并行域结构:reduction子句*在reduction子句中,编译器为每一个线程创建变量sum的私有副本。当循环完成后,将这些值加在一起并把结果放到原始的变量sum中*reduction子句中的op操作必须满足算术结合律和交换律例:#pragma omp for reduction(+:sum)8.并行DO/FOR循环制导 :调度子句SCHEDULE(schedule(kind,[chunksize],其中kind为static,dynamic或者runtime,chunksize为一个整数表达式)*该子句给出迭代循环划分后的块的大小和线程执行的块范围9.SECTIONS制导:任务分配区*任务分配区可以指导OpenMP编译器和运行时库将应用程序中标出的结构化块分配到并行区域的线程上#pragma parallel sections[clauses]{[#pragma section][#pragma section]}10.SINGLE制导:结构体代码只能由一个线程执行,并由首先由执行改代码的线程执行,其他线程等待直至改结构块被执行结束11.BARRIER制导:栏障是OpenMP用于线程同步的一种方法#pragma parallel barrier*在所有线程到达之前,没有线程可以提前通过一个barrier*在DO/FOR,SECTIONS和SINGLE制导后,有一个隐式的barrier存在*要么所有线程都遇到barrier,要么所有线程都没有遇到,否则会出现死锁12.NOWAIT子句:可以出去隐藏在循环,SECTIONS或并行区后的栏障#pargma parallel for nowait13.private子句,firstprivate和lastprivate*private:指定每个线程都有他自己的变量私有副本*firstprivate:指定每个线程都有他自己的变量私有副本,并且变量要被继承主线程的初值*lastprivate:主要是用来指定将线程中的私有变量的值在并行处理结束后复制回主线程中的对应变量14数据竞争:用类似于互斥量的机制进行私有化和同步,可以消除数据竞争
OpenMP学习总结
最新推荐文章于 2021-06-19 10:31:56 发布