【问题标题】:Can "#pragma omp parallel for " be used inside a loop?可以在循环内使用“#pragma omp parallel for”吗?
【发布时间】:2012-08-20 12:48:47
【问题描述】:

“#pragma omp parallel for”能否以下列形式在循环中使用:

For (i=0;i<...;.i+=1) 
  { #pragma omp parallel for
      for(j=0;j<...;j+=1) 
       { Some code.....} 
  • 这是否会在 'j' 上并行化循环?

感谢您的提前!

【问题讨论】:

    标签: c loops parallel-processing openmp


    【解决方案1】:

    是的,可以这样使用。但是编译器指令必须单独一行

    for( ... )
    {
        #pragma omp parallel for
        for( ...
    //..
    

    此外,这确实只会并行执行内部循环。如果您需要两个循环并行执行,则需要在外循环上方再添加一个#pragma omp parallel for

    【讨论】:

    • 我们需要注意在这个实现中,外部的'for'等待'omp parallel for'中的'for'结束才能继续循环。这会影响执行的性能。
    【解决方案2】:

    它可以像你说的那样使用,但如果我是你并且想要避免每次迭代的 fork/join 我会这样做:

    #pragma omp parallel for
    for(j loop)
    {
       for(i loop)
       {
            //Modify your code if necessary.
       }
    }
    

    在上面的 sn-p 中,如果您的最大线程数为 10,并且您的 j 长度为 100,那么将有 10 个线程,每个线程将运行 10 次 j 迭代。

    【讨论】:

    • THX,但我很抱歉 - 我不明白你指出的问题。你能解释得更清楚吗?不就是计算的哪些部分依赖于其他部分的问题吗? - 如果我正确地得到你 - 只是'i'值取决于以前的'i'位置,而'j'值不依赖于 - 因此可以并行计算。是这个意思吗?
    • 您是否建议切换循环的顺序?为什么?
    • fork/join 操作早已使用线程池实现,因此比原始实现便宜得多。然而,最好将它们保持在尽可能高的水平。
    • 我试图帮助您避免启动线程并在每次迭代时终止它们。通过改变程序逻辑。此外,如果迭代 之间存在数据依赖关系,那么如果您发布有关您要实现的目标的更多详细信息,您应该使用一些同步机制,我想我可以为您提供更多帮助。
    • @HristoIliev,感谢您指出这一点,但 OpenMP 有不同的实现。我正在使用 MS 实现,但如果您尝试编写高性能程序,我相信您不需要依赖它。
    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2022-12-07
    相关资源
    最近更新 更多