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