提到使用OpenMP实现多线程编程,相对比叫便捷,很多兄弟一定已经很熟悉了。一般的用法都是把OpenMP用在for等循环上,论坛上好多OpenMP在这上的用法也有好多的解释了,我也不班门弄斧了。
 
for等循环如果要用在OpenMP上,一般的限制还是比较多的,比如循环不同序列间的数据或逻辑依赖不能过强,必须可以将其分解为或转化为互相独立的关系。此外,有时候虽然看是做到互相独立,但代价很大,比如加了很多的锁,多线程的效果不是很好。这就导致了对OpenMP的使用受到了比较大的限制。一般以我的经验,当for循环处理大的矩阵、数组等时,用OpenMP比较合适,但如果涉及到了很多的逻辑判断,就不是很理想。
 
从上面可以看出,for等循环不总是适合使用OpenMP。但是不是除了循环,OpenMP就没有用武之地了呢?当然不是,还可以用OpenMPsection,如下图说示,原先线性执行的程序被分成了并行的三段:
#pragma omp parallel sections
{
    #pragma omp section
{
   Function1
}
 
    #pragma omp section
{
   Function2
}
 
    #pragma omp section
{
   Function3
}
}
 
这里就给大家讲一个我遇到的使用Section的实例:某段程序执行非常繁重的初始化操作,不同部分之间依赖性不大。那么使用了上述OpenMP之后,终于并行了,大大加快了初始化进程。