OpenMP自学笔记(二) 最简单的并行计算程序

从串行到并行

我们知道,一个正常的C语言程序,从main函数开始,以return 0为结束,就像人的一天

起床—吃饭—工作—睡觉(return 0)

OpenMP程序,往往是串行-并行-串行的一个结构,
就像人的早晨

睁眼-下床-刷牙-洗脸
以上这些操作都是串行的

但是人工作时往往是并行的

写代码-查文档
写代码-和女朋友商量约会时间

OpenMP程序亦是如此。
从起床(串行区)开始,中间工作时(并行区)派生出多个线程处理工作,最后可能睡觉(再回到串行区)
所以说,OpenMP程序通常采用串行→并行→串行→并行→串行,而不是整个程序都采用并行机制去运行。

for循环的并行化

先回顾一下,OpenMP的相关语句

omp_set_num_threads(3); //设置启用3个线程

#pragma omp paralle // 并行编译指导语句,代表着并行区域的开始
tid=omp_get_thread_num(); //获取当前的进程号
nthreads=omp_get_num_threads(); //获取总进程数

循环的并行化,是比较独立和重要的,也是最简单有效的并行。举个例子,如果循环100次,我们采用1个线程跑100次,和4个线程个跑25次,需要的时间肯定是后者要短,而且要短的多。

#pragma omp for

通过上述指令,就可以对循环进行并行化,来达到加速程序的目的。

简单的并行计算程序

我们设计一个程序,要计算c[i]数组的值,c[i]=a[i]+b[i]
如果我们设置3个线程,i=3,1个线程做1次加法

#include
#include
using namespace std;

int main()
{
    int tid;    //表示当前线程号
    int nthreads;   //表示所有的线程数
    omp_set_num_threads(3);     //设置启用3个线程

    int a[3]={1,2,3};
    int b[3]={1,2,3};
    int c[3];

    /*并行区域开始*/
    #pragma omp parallel private(tid,nthreads) shared(a,b,c)
    {
        #pragma omp for
        for(int i=0;i<3;i++)
        {
            tid=omp_get_thread_num();   //获取当前的进程号
            nthreads=omp_get_num_threads();     //获取总进程数
            c[i]=a[i]+b[i];

            cout<<"线程数:"<

你可能感兴趣的:(OpenMP自学笔记(二) 最简单的并行计算程序)