1

スーパーコンピュータを用いた計算電磁気学研究室で研究を行っています。ここでは、クラスターを使用して、5 億を超える未知数を含む問題を解決しています。この時点で、これらすべての計算を並列化することに問題があります。これまではMPIでノード間の通信を行ってきましたが、OpenMPのメリットとして、ノード内のプロセッサ間通信を可能にするためにOpenMPを使用することを決定しようとしています。それにもかかわらず、openMP からは効率が得られませんでした (おそらく誤ったコーディングのため)。実際のポイントは、私が提供するコードの何が問題なのかわからないということです。

OpenMP ディレクティブを使用しない純粋なコードのシーケンシャルでも同じ時間がかかりました。「top」コマンドを使用すると、並列セクションで 8 つのプロセッサが %100 のパフォーマンスで動作していました。

gfortran --バージョン | head -1 GNU Fortran (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)

PROGRAM dotproduct
    USE omp_lib   
    IMPLICIT none 

    INTEGER ::h,m,i,TID,NTHREADS,j,ierr

    REAL :: start,end
    REAL, ALLOCATABLE, DIMENSION(:,:) :: a
    REAL, ALLOCATABLE, DIMENSION(:) :: x
    REAL, ALLOCATABLE, DIMENSION(:) :: b

    m= 20000
    OPEN(UNIT=1,FILE='matrix20000.dat',STATUS='UNKNOWN')
    OPEN(UNIT=2,FILE='vector20000.dat',STATUS='UNKNOWN')

    ALLOCATE(a(m,m)) 
    ALLOCATE(x(m))
    ALLOCATE(b(m))
    REWIND(1)
    REWIND(2)

    WRITE(*,*) ' Reading is just started'

    READ(1,*), a(:,:) 
    READ(2,*), x(:)

    WRITE(*,*) ' Reading is over'
    WRITE(*,*) ' Calculating will be started after parallelization'

    !$OMP PARALLEL PRIVATE(i,TID,j),SHARED(NTHREADS,m,a,x,b)
    TID= omp_get_thread_num()
    IF(TID == 0) THEN
      NTHREADS = OMP_GET_NUM_THREADS()
      PRINT*, 'Starting matrix multiple example with', NTHREADS
    END IF
    CALL cpu_time(start)
    !$OMP DO
          DO i=1, m
             b(i)= 0
             DO j=1, m
                b(i) = b(i)+ a(i,j)*x(j)
             END DO
          END DO
    !$OMP END DO
    !$OMP END PARALLEL
    CALL cpu_time(end)

    WRITE(*,*) end-start,' seconds'

    !DO i=1,m
    !   WRITE(*,*) b(i)
    !END DO

    DEALLOCATE(a)                     !----Deallocation
    DEALLOCATE(x)
    DEALLOCATE(b)


    END PROGRAM dotproduct
4

2 に答える 2

1

古典的なエラー - Cpu_time は通常、合計 CPU 時間を測定します。つまり、すべてのスレッドにわたって合計されます! したがって、完全な高速化により、スレッド数に関係なく一定の時間が得られます

system_clock などで経過時間を測定してみて、何が得られるかを確認してください。

ところで - nthreads が共有されるのはなぜですか? プライベートはなるべく守ったほうがいい

(これが2回表示されたらごめんなさい、最初の努力...)

于 2011-09-15T09:12:13.277 に答える
0

競合するメモリ アクセスの問題のようです。すべてのプロセスが共有 x(j) にアクセスします。これは実際の解決策ではありませんが、各スレッドで x を複製してみて、これが役立つかどうかを確認してください。

于 2011-09-11T18:04:18.863 に答える