zoukankan      html  css  js  c++  java
  • 【openmp】for循环的break问题

      问题描述:在用openmp并行化处理for循环的时候,便无法在for循环中用break语句,那么我们如何实现这样的机制呢?在stackoverflow上看到一个不错的回答总结一下。

    volatile bool flag = false;
    
    #pragma omp parallel for shared(flag)
    for(int i = 0;i < 100000;i++)
    {
        if(flag) continue;
        if(element[i]...)
        {
              ...
              flag=true;
        }       
    }
    

      其中volatile关键字的作用是使得flag变量的改变在所有进程中同步,即保证只要有一个线程将flag改为true,那么从flag值改变的这一刻起所有其他线程的flag值都将变为true,那么所有的线程就不会对element[i]继续进行判断,相当于饶了一个弯实在并行的for中实现了break。

      stackoverflow上针对这个答案还有一个改进版的答案也值得学习一下:

    volatile bool flag = false;
    
    for(int i = 0;i < 100&&!flag;i++) {
        int base = i*1000;
    #pragma omp parallel for shared(flag)
        for(int j = base;j <= base+1000;j++) {
             if(flag) continue;
             if(element[i+base] ...)
             {
                  ....
                  flag=true;
             }
        }
    }
    

      这样相当于将100000次循环拆成外层的串行for和内层并行for,并且在外层加入了判断机制,如果flag的位置比较靠前就被决定了,那该算法能大大提升性能。

      (PS:附上关于volatile关键字的详解文章:http://ifeve.com/volatile/)

  • 相关阅读:
    Ignite、Vertx
    Spring boot ConditionalOnClass原理解析
    SPI
    Redis (总结)
    Mysql 线程池 ===
    Mysql JDBC-mysql-Driver queryTimeout分析
    Java网关服务-AIO(三)
    Java网关服务-AIO(二)
    Java网关服务-AIO(一)
    Java nio Server端示例
  • 原文地址:https://www.cnblogs.com/immortal-worm/p/9770661.html
Copyright © 2011-2022 走看看