task vs section в OpenMP. В чем разница?
От: Hexxx  
Дата: 25.07.10 16:00
Оценка:
Судя по описанию должно быть одно и тоже. Но вот пробую юзать и разница существенная. Если юзаю таски прирост по сравнению с линейным кодом почти 100%, если юзаю на том же коде секции, то получаю от силы 10% прироста. Где же нужно юзать секции чтобы от них был толк?
Re: task vs section в OpenMP. В чем разница?
От: ilnar Россия  
Дата: 25.07.10 18:05
Оценка:
Здравствуйте, Hexxx, Вы писали:

H>Судя по описанию должно быть одно и тоже. Но вот пробую юзать и разница существенная. Если юзаю таски прирост по сравнению с линейным кодом почти 100%, если юзаю на том же коде секции, то получаю от силы 10% прироста. Где же нужно юзать секции чтобы от них был толк?


нет примера кода,
предполагаю, что таски/секции внутри цикла, и причина в неявных барьерах в конце блока секций
Re[2]: task vs section в OpenMP. В чем разница?
От: Hexxx  
Дата: 25.07.10 19:00
Оценка:
Здравствуйте, ilnar, Вы писали:

I>Здравствуйте, Hexxx, Вы писали:


H>>Судя по описанию должно быть одно и тоже. Но вот пробую юзать и разница существенная. Если юзаю таски прирост по сравнению с линейным кодом почти 100%, если юзаю на том же коде секции, то получаю от силы 10% прироста. Где же нужно юзать секции чтобы от них был толк?


I>нет примера кода,

I>предполагаю, что таски/секции внутри цикла, и причина в неявных барьерах в конце блока секций
То есть если нет примера кода, вы не знаете в чем разница между section и task в принципе?

Код:
void matmultrecmy(int m, int n, int p, int mf, int ml, int nf, int nl, int pf, int pl, double **A, double **B, double **C)
#define GRAIN  32768 /* product size below which matmultleaf is used */  

{     
    if ((ml-mf)*(nl-nf)*(pl-pf) < GRAIN)   
        matmultleafmy(m, n, p, mf, ml, nf, nl, pf, pl, A, B, C);   
    else 
    {   
#pragma omp task
        matmultrec(m, n, p, mf, mf+(ml-mf)/2, nf, nf+(nl-nf)/2, pf, pf+(pl-pf)/2, A, B, C);   
        matmultrec(m, n, p, mf, mf+(ml-mf)/2, nf+(nl-nf)/2, nl, pf, pf+(pl-pf)/2, A, B, C);   
#pragma omp task
        matmultrec(m, n, p, mf, mf+(ml-mf)/2, nf, nf+(nl-nf)/2, pf+(pl-pf)/2, pl, A, B, C);   
        matmultrec(m, n, p, mf, mf+(ml-mf)/2, nf+(nl-nf)/2, nl, pf+(pl-pf)/2, pl, A, B, C);   
#pragma omp task
        matmultrec(m, n, p, mf+(ml-mf)/2, ml, nf, nf+(nl-nf)/2, pf, pf+(pl-pf)/2, A, B, C);   
        matmultrec(m, n, p, mf+(ml-mf)/2, ml, nf+(nl-nf)/2, nl, pf, pf+(pl-pf)/2, A, B, C);   
#pragma omp task
        matmultrec(m, n, p, mf+(ml-mf)/2, ml, nf, nf+(nl-nf)/2, pf+(pl-pf)/2, pl, A, B, C);   
        matmultrec(m, n, p, mf+(ml-mf)/2, ml, nf+(nl-nf)/2, nl, pf+(pl-pf)/2, pl, A, B, C);   
#pragma omp taskwait
    }   
}   

void matmultrmy(int m, int n, int p, double **A, double **B, double **C)
{   

    int i,j; 
#pragma omp parallel
    {
#pragma omp for 
        for (i = 0; i < m; i++)   
            for (j=0; j < n; j++)   
                C[i][j] = 0;   


#pragma omp single
        matmultrecmy(m, n, p, 0, m, 0, n, 0, p, A, B, C);   
    }
}

Так все работает быстро.

void matmultrecmy(int m, int n, int p, int mf, int ml, int nf, int nl, int pf, int pl, double **A, double **B, double **C)

#define GRAIN  32768 /* product size below which matmultleaf is used */  

{     
    if ((ml-mf)*(nl-nf)*(pl-pf) < GRAIN)   
        matmultleafmy(m, n, p, mf, ml, nf, nl, pf, pl, A, B, C);   
    else 
    {   
#pragma omp parallel sections
{
#pragma omp section
{
            matmultrec(m, n, p, mf, mf+(ml-mf)/2, nf, nf+(nl-nf)/2, pf, pf+(pl-pf)/2, A, B, C);   
            matmultrec(m, n, p, mf, mf+(ml-mf)/2, nf+(nl-nf)/2, nl, pf, pf+(pl-pf)/2, A, B, C); 
}

#pragma omp section
{
            matmultrec(m, n, p, mf, mf+(ml-mf)/2, nf, nf+(nl-nf)/2, pf+(pl-pf)/2, pl, A, B, C);   
            matmultrec(m, n, p, mf, mf+(ml-mf)/2, nf+(nl-nf)/2, nl, pf+(pl-pf)/2, pl, A, B, C); 
}

#pragma omp section
{
            matmultrec(m, n, p, mf+(ml-mf)/2, ml, nf, nf+(nl-nf)/2, pf, pf+(pl-pf)/2, A, B, C);   
            matmultrec(m, n, p, mf+(ml-mf)/2, ml, nf+(nl-nf)/2, nl, pf, pf+(pl-pf)/2, A, B, C);
}

#pragma omp section
{

            matmultrec(m, n, p, mf+(ml-mf)/2, ml, nf, nf+(nl-nf)/2, pf+(pl-pf)/2, pl, A, B, C);   
            matmultrec(m, n, p, mf+(ml-mf)/2, ml, nf+(nl-nf)/2, nl, pf+(pl-pf)/2, pl, A, B, C);   
}
} // sections

    }   //else
}

А вот так уже прирост лишь 10%.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.