0

並列計算用に書かれた FORTRAN プログラムがあります。プログラムは引数を取り、スレッドの数を引数として定義できます。サンプルコードは次のとおりです。

COUNT = NARGS()
      NTHREADS = 1

      ! *** GET THE COMMAND LINE ARGUMENTS, IF ANY
      IF(COUNT.GT.1)THEN
        ! *** ARGUMENT 1
        CALL GETARG(1, BUFFER, iStatus)
        IF (Buffer(1:4).EQ.'-NOP'.OR.Buffer(1:4).EQ.'-nop') THEN
          PAUSEIT=.FALSE.
        ENDIF
        IF (Buffer(1:3).EQ.'-NT'.OR.Buffer(1:3).EQ.'-nt') THEN
          READ(Buffer(4:10),*) NTHREADS
        ENDIF
        IF(COUNT.GT.2)THEN
          ! *** ARGUMENT 2
          CALL GETARG(2, BUFFER, iStatus)
          IF (Buffer(1:4).EQ.'-NOP'.OR.Buffer(1:4).EQ.'-nop') THEN
            PAUSEIT=.FALSE.
          ENDIF
          IF (Buffer(1:3).EQ.'-NT'.OR.Buffer(1:3).EQ.'-nt') THEN
            READ(Buffer(4:10),*) NTHREADS
          ENDIF
         ENDIF
      ENDIF

コンパイルしたファイル名が「hellofortran」だとしましょう。スレッドの数を次のように定義できます

./hellofortran -nt4 

私のプログラムは、4 つのスレッドでプログラムを読み取ります。問題は、どのコンピューターでも同じ数のコアで実行できることです。デュアル コア プロセッサを使用しているとします。コアは 2 つしかありませんが、6 ~ 8 スレッドまたは任意の数で実行できます。この特定のインスタンスのスレッド数を正しく定義するにはどうすればよいですか?

私の問題を説明したことを願っています。プログラムを改善するにはどうすればよいか、すぐに聞けることを楽しみにしています。ありがとう。

ジババ

4

1 に答える 1

1

OpenMP を使用していて、使用するスレッド数を設定するだけの場合は、環境内のスレッド数を指定するだけです。

OMP_NUM_THREADS=4
./hellofortran

通常どおりに OpenMP コードを記述します。スレッド数をプログラムで設定する方法もありますが、これはおそらくより簡単です。

于 2013-02-01T00:20:37.443 に答える