OpenMP: невозможно распараллелить вложенные циклы - PullRequest
3 голосов
/ 26 октября 2011

Я хочу распараллелить цикл с внутренним циклом внутри него. Мой код выглядит так:

    #pragma omp parallel for private(jb,ib) shared(n, Nb, lb, lastBlock, jj, W, WT) schedule(dynamic)   //private(ib, jb) shared(n, Nb, lb, lastBlock, jj, W, WT)       //parallel for loop with omp
    for(jb=0; jb<Nb; jb++)          
    {
            int lbh = (jb==Nb-1) ? lastBlock : lb;
            int ip = omp_get_thread_num();

            packWT(a, n, lb, s, jb, colNr, WT[ip], nr); //pack WWT[jb]      


            for(ib=jb; ib<Nb; ib++)
            {
                    int lbv = (ib==Nb-1) ? lastBlock : lb;

                    multBlock_2x4xk(a, n, jj + ib*lb, jj + jb*lb, W+ib*lb*lb, WT[ip], lb, lbv, lbh);    //MULT BLOCK - 2x4xK (W[jb]*W[ib])

            }
    }

Я измеряю время, затраченное на вычисление этих циклов. Это то же самое для нескольких потоков, что и для одного потока. Когда я изменяю пункт

private(jb,ib)

для

private(jb)

Все меняется. Я имею в виду, что для нескольких потоков процесс вычисляется быстрее, чем для одного потока. В чем проблема?

1 Ответ

4 голосов
/ 27 октября 2011

Проблема в том, что ваш внутренний цикл не имеет канонической формы. Следовательно, openmp не может распараллелить циклы, и никакого ускорения достичь невозможно. Петли должны выглядеть следующим образом. Где начало, idx и inc не могут быть изменены во время параллельной части кода. canonical shape of for loops

Кажется, я определила вашу проблему. Вы вызываете эти функции:

  packWT(a, n, lb, s, jb, colNr, WT[ip], nr); packWT(a, n, lb, s, jb, colNr, WT[ip], nr);
  multBlock_2x4xk(a, n, jj + ib*lb, jj + jb*lb, W+ib*lb*lb, WT[ip], lb, lbv, lbh);

где одним аргументом является переменная цикла jb, поскольку jb может быть изменено внутри функции (в зависимости от объявления функции), компилятор решает не распараллеливать цикл. Чтобы избежать этого, скопируйте переменную jb в локальную переменную и передайте локальную переменную функции.

...