1

それぞれが隣接するプロセッサを備えた4つのスレッドで4つのチームを作成する必要があります。

私が期待している結果は、たとえば次のとおりです。

Team 0 Thread 0 Processor: 0
Team 0 Thread 1 Processor: 1
Team 0 Thread 2 Processor: 2
Team 0 Thread 3 Processor: 3
Team 1 Thread 0 Processor: 4
Team 1 Thread 1 Processor: 5
Team 1 Thread 2 Processor: 6
Team 1 Thread 3 Processor: 7
Team 2 Thread 0 Processor: 8
Team 2 Thread 1 Processor: 9
Team 2 Thread 2 Processor: 10
Team 2 Thread 3 Processor: 11
Team 3 Thread 0 Processor: 12
Team 3 Thread 1 Processor: 13
Team 3 Thread 2 Processor: 14
Team 3 Thread 3 Processor: 15

GOMP_CPU_AFFINITY変数を使用して、GCCでプロセッサ親和性を処理できます。

私が使用しているもの:

#pragma omp parallel num_threads(4)

2つのフォークレベルを取得するために2回。

現在、GOMP_CPU_AFFINITYで次の順序になっています。

0 4 8 12 1 2 3 5 6 7 9 10 11 13 14 15

したがって、最初のフォークである「父親のフォーク」は次のようになります。

Team 0 Thread 0 Processor: 0
Team 1 Thread 0 Processor: 4
Team 2 Thread 0 Processor: 8
Team 3 Thread 0 Processor: 12

私が抱えている問題は、フォークの2番目のグループが順序なしで作成されるため、たとえば、この状況が発生する可能性があることです(#pragma ompアトミックを使用しているため、いつでも1人の「父」だけがより多くのプロセッサを要求できます) :

Team 0 Thread 0 Processor: 0
Team 0 Thread 1 Processor: 5
Team 0 Thread 2 Processor: 6
Team 0 Thread 3 Processor: 7
Team 1 Thread 0 Processor: 4
Team 1 Thread 1 Processor: 13
Team 1 Thread 2 Processor: 14
Team 1 Thread 3 Processor: 15
Team 2 Thread 0 Processor: 8
Team 2 Thread 1 Processor: 1
Team 2 Thread 2 Processor: 2
Team 2 Thread 3 Processor: 3
Team 3 Thread 0 Processor: 12
Team 3 Thread 1 Processor: 9
Team 3 Thread 2 Processor: 10
Team 3 Thread 3 Processor: 11

問題は、この2番目の請願を順番に行う方法はありますか?

私はロックか何かで同期方法を作らなければならないと思います...

前もって感謝します!

  • ハビエル
4

1 に答える 1

1

最後に、これを機能させることができました。これが私のコードです。

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>

int main(int argc, char *argv[]){
    int padre, hijo;

    int contador = 0;
    omp_set_nested(1);
    int suma;
    #pragma omp parallel private(padre) shared(contador) num_threads(4)
    {
        padre = omp_get_thread_num();

        {

            while(contador != padre){
                // Don't know what to put here
            };

            #pragma omp parallel private(hijo) shared(padre, contador) num_threads(4)
            {
                hijo = omp_get_thread_num();
                printf("\nFather: %d Son: %d Processor: %d\n", padre, hijo, sched_getcpu());
                #pragma omp master
                {
                    contador++;
                }
            }
        }
    }
}

注:スペイン語では、パドレは父、ヒジョは息子、コンタドールはカウンターです:P

私が今直面している問題は、-O3最適化を使用してコードをコンパイルすると、たとえば、ループ内にprintf行を配置しない限り、whileループが「消える」ことです。別の質問で聞いてみるべきだと思います!

みなさん、ありがとうございました!

  • ハビエル
于 2013-01-05T18:57:45.663 に答える