使用OpenMb并行化红黑SOR

时间:2016-05-31 19:30:08

标签: performance for-loop optimization parallel-processing openmp

我有一个使用Red-Black SOR求解器迭代的方域。由于域的中心线上的奇点,我必须将每个部分(红色和黑色)分成三个不同的区域(上部区域,下部区域和中心线)。我想知道如何使用openMP并行化红色和黑色部分的外部循环,以便它是最有效的。在内部循环中使用#pragma omp parallel是否有意义?

感谢。

     //****************************************Red nodes*************************************************

    //lower block
    #pragma omp parallel for 
    for(int j =2; j<(vec[b].m+1)/2; ++j){
        for(int i =((j+1)%2)+2 ;i<vec[b].m; i+=2){      
            vec[b].node(i,j) =(1-omega)*vec[b].node(i,j)+ 0.25*omega* (vec[b].node(i+1,j)+
            vec[b].node(i-1,j)+
            vec[b].node(i, j-1)+
            vec[b].node(i, j+1)) - 
            h2* f[b].node(i ,j);       
        }
    }

    //center line
    int j =(vec[b].m+1)/2; 
        for(int i =((j+1)%2)+2 ;i<(vec[b].m+1)/2; i+=2){    
            vec[b].node(i,j) =(1-omega)*vec[b].node(i,j)+ 0.25*omega* (vec[b].node(i+1,j)+
            vec[b].node(i-1,j)+
            vec[b].node(i, j-1)+
            vec[b].node(i, j+1)) - 
            h2* f[b].node(i ,j);       
        }

    //upper block
    #pragma omp parallel for 
    for(j =(vec[b].m+1)/2+1; j<vec[b].m; ++j){
        for(int i =((j+1)%2)+2 ;i<vec[b].m; i+=2){  
            vec[b].node(i,j) =(1-omega)*vec[b].node(i,j)+ 0.25*omega* (vec[b].node(i+1,j)+
            vec[b].node(i-1,j)+
            vec[b].node(i, j-1)+
            vec[b].node(i, j+1)) - 
            h2* f[b].node(i ,j);       
        }
    }   


    //***************************************Black nodes*************************************************

    //lower block
    #pragma omp parallel for 
    for(j =2; j<(vec[b].m+1)/2; ++j){
        for(int i =((j%2)+2); i<vec[b].m; i+=2){        
            vec[b].node(i,j) =(1-omega)*vec[b].node(i,j)+ 0.25*omega* (vec[b].node(i+1,j)+
            vec[b].node(i-1,j)+
            vec[b].node(i, j-1)+
            vec[b].node(i, j+1)) - 
            h2* f[b].node(i ,j);       
        }
    }

    //middle line
        j =(vec[b].m+1)/2; 
        for(int i =((j%2)+2); i<(vec[b].m+1)/2; i+=2){  
            vec[b].node(i,j) =(1-omega)*vec[b].node(i,j)+ 0.25*omega* (vec[b].node(i+1,j)+
            vec[b].node(i-1,j)+
            vec[b].node(i, j-1)+
            vec[b].node(i, j+1)) - 
            h2* f[b].node(i ,j);       
        }

    //upper block
    #pragma omp parallel for 
    for(j =(vec[b].m+1)/2+1; j<vec[b].m; ++j){
        #pragma omp parallel for 
        for(int i =((j%2)+2); i<vec[b].m; i+=2){    
            vec[b].node(i,j) =(1-omega)*vec[b].node(i,j)+ 0.25*omega* (vec[b].node(i+1,j)+
            vec[b].node(i-1,j)+
            vec[b].node(i, j-1)+
            vec[b].node(i, j+1)) - 
            h2* f[b].node(i ,j);       
        }
    }       
}

}

0 个答案:

没有答案