OpenMP学习笔记

编译命令:gcc –O XXX.c -fopenmp

1.      Multi-thread Programming

1.      首先要import相应的API,因此必须在首行写上#include “omp.h”

2.      对于要并行执行的部分,用#pragma omp parallel{…} 标记并行块范围。

3.      在并行块里面,用int ID = omp_get_thread_num(); 来获取并行线程的ID。注意:Master thread的ID为0。

4.      设定并行线程的数目的方式有两种:1. 如果要设定并行线程的数目在并行块外,调用omp_set_num_threads(intnum)函数。2.也可以在声明并行块的时候同时声明设定并行线程的数目,即使用#pragma omp parallelnum_threads(int num){}代替#pragma omp parallel{ }。如果不设定并行线程的数目,则并行线程数目的缺省值为CUP的核数。

5.      在并行块内,一般会使用int nthrds = omp_get_num_threads()来获得并行线程的总数,这样方便在遍历的时候设立stride。

2.      Synchronization

2.1 critical

在并行块中的关键区域上锁,实行局部的串行操作。

#pragma omp critical{ …}

2.2 atomic

作用同critical,但是仅对某个内存区域的读写操作有效(e.g.如果要调用某个函数,可能就会失效),速度比critical更快。

#pragma omp atomic{ …}

3.      Parallel Loops

3.1自动并行执行for循环(循环子默认为private)

#pragma omp for{ …}

e.g.

#pragma omp parallel for

         for(i = 0; i<N;i++)

a[i] = a[i] + b[i];

等效于

#pragma omp parallel

{

         intid, i, Nthrds, istart, iend;

         id= omp_get_thread_num();

         Nthrds= omp_get_num_threads();

         istart= id * N / Nthrds;

         iend= (id + 1)* N / Nthrds;

for(i=istart;i<iend; i++){

         a[i] = a[i] + b[i];

}

}

本质上就是把循环子i的遍历空间进行划分,让每个线程包办一部分的iterationsiteration次数尽量做到平均。前提是不存在依赖!

:如果标记块中仅含有一个statement,则#pragma ompfor后的大括号可以去掉。如果整个并行块里面只有一个for循环,则可以将声明并行块的#pragma omp parallel{ …}与并行块里面的#pragma omp for{…}简写成#pragma omp parrellel for{ …}

此外,用并行for循环优化时,注意要去掉loop carried dependence,e.g.

int i, j, A[MAX];

j = 5;

for(i=0;i<MAX;i++){

  j +=2;

  A[j] = big(j);

}

改为

int i, j, A[MAX];

#pragma omp parallel for{

for(i=0;i<MAX;i++){

  int j = 5 + 2i;

  A[j] = big(j);

}

实质是将并行块外定义的用j递推公式表示的线程共享变量,替换为并行块内定义的用i通项公式表示的线程私有变量。

3.2自动并行执行reduction

reduction (op:list)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值