1

I need some help with OpenMP. Is it possible that if a thread ended in a for loop it helps then to another thread, dividing it? I have a loop in a loop where are breaks; and the threads doesn't end at the same time, so there are threads which has much work, and other threads which are done. (so there are unused cores). I run my program on a corei7, and it seems that OpenMP divide the loop to 8 threads. But the utilization starts to drop after some time when one thread did the job.

#pragma omp parallel for
for(i = 0; i < Vector.size(); i++) {
    for(j = 0; j < othervector.size(); j++) {
        {some code}
        if(sth is true) break;
    }
}

Thank you.

4

1 に答える 1

2

SCHEDULEfor ループのループ反復のデフォルトの分割 /は、実装に依存します。あなたのケースではomp parallel for、デフォルトの shedule を使用すると STATIC になる可能性があります。これは、ベクトルのサイズに応じて、各スレッドに固定のデータチャンクが割り当てられることを意味します。ワークロードは静的に分割することによってバランスを取ることができないようです。DYNAMIC、GUIDED、および RUNTIME句を調べて、これが (仮想) コアの高い使用率を再確立するのに役立つかどうかを確認してください。チャンク サイズによっては、もちろん追加のオーバーヘッドが発生しますが、静的にスケジューリングするときにコアがアイドル状態で費やす時間と比較すると、無視できる程度になる可能性があります。

元の質問に答えるには、スレッドに別のスレッドの作業を続行するように指示できるとは思いません。作業が割り当てられると、各スレッドはそれを独自に処理する必要があります。これが私が試してみたいものです。

#define CHUNKSIZE 100

#pragma omp parallel for schedule(dynamic,chunk) nowait
for(i = 0; i < Vector.size(); i++) {
    for(j = 0; j < othervector.size(); j++) {
        {some code}
        if(sth is true) break;
    }
}

実際、Hristo Iliev は少し前に同様の質問に対して非常に素晴らしい回答を書きました。

于 2013-10-04T09:12:07.393 に答える