从串行到并行
我们知道,一个正常的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
通过上述指令,就可以对循环进行并行化,来达到加速程序的目的。