2013-10-29 107 views
1

我想并行化那种循环。请注意,每个“calc_block”使用在前一次迭代中获得的数据。OpenMP并行化循环

for (i=0 ; i<MAX_ITER; i++){ 

    norma1 = calc_block1(); 
    norma2 = calc_block2(); 
    norma3 = calc_block3(); 
    norma4 = calc_block4(); 

    norma = norma1+norma2+norma3+norma4; 
    ...some calc... 
    if(norma<eps)break; 
} 

我tryed这一点,但加速是相当小〜1.2

for (i=0 ; i<MAX_ITER; i++){ 
    #pragma omp parallel sections{ 
    #pragma omp section 
     norma1 = calc_block1(); 
    #pragma omp section 
     norma2 = calc_block2(); 
    #pragma omp section 
     norma3 = calc_block3(); 
    #pragma omp section 
     norma4 = calc_block4(); 
    } 

    norma = norma1+norma2+norma3+norma4; 
    ...some calc... 
    if(norma<eps)break; 
} 

我认为它的发生是因为使用循环内部分的开销。但我不知道如何修复它... 在此先感谢!

+0

MAX_ITER的价值是什么?整个代码和每个块的绝对时间成本分别是多少? – kangshiyin

回答

3

您可以通过移动并行区域内的整个循环来减少开销。因此,用于实施团队的池中的线程只会“唤醒”一次。这是一个有点棘手,涉及变量共享类的仔细考虑:

#pragma omp parallel private(i,...) num_threads(4) 
{ 
    for (i = 0; i < MAX_ITER; i++) 
    { 
     #pragma omp sections 
     { 
     #pragma omp section 
     norma1 = calc_block1(); 
     #pragma omp section 
     norma2 = calc_block2(); 
     #pragma omp section 
     norma3 = calc_block3(); 
     #pragma omp section 
     norma4 = calc_block4(); 
     } 

     #pragma omp single 
     { 
     norma = norm1 + norm2 + norm3 + norm4; 
     // ... some calc .. 
     } 

     if (norma < eps) break; 
    } 
} 

两个sectionssingle结构在其末端具有隐含的壁垒,因此线程将之前进入下一个循环周期同步。 single构建体重现了程序以前的连续部分。 private子句中的...部分应列出尽可能多的变量,这些变量只与... some calc ...有关。这个想法是使用线程局部变量来运行串行部分,因为大多数OpenMP实现对共享变量的访问速度较慢。

请注意,通常由于完全不同的原因,加速时间可能不是线性的。例如,calc_blockX()(其中X1,2,34)可能具有太低的计算强度,因此需要非常高的存储器带宽。如果内存子系统无法同时提供全部4个线程,则加速时间将小于4.此类情况的一个示例 - this question

+0

我有点困惑你为什么使用'flush'。从我所了解的'single'有一个隐含的障碍,它在退出时调用一个隐式的'flush',并且所有的共享对象都是同步的,应该包含'norma'。我从来没有使用'flush',所以这是我想了解的东西。 –

+0

@redrum,你已经提出了反对使用flush的有效论据。 –

+0

按照此IBM [链接](http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Fcompiler%2Fref%2Fruompflu.htm) (和其他)隐式刷新“除了自动存储持续时间不可访问外,所有共享对象都是同步的。”句子的最后部分“除了自动存储时间不可访问”是什么意思?这让我有点紧张。 –