2

一連の ASCII データ ファイルを読み取る必要がある Fortran コードがあります (これらはすべて合わせて約 25 Gb です)。基本的に、このコードは特定の ascii ファイルを開き、情報を読み取り、それを使用していくつかの操作を実行してから閉じます。次に、別のファイルを開き、情報を読み取り、いくつかの操作を実行して、もう一度閉じます。残りの ascii ファイルについても同様です。

全体として、各完全な実行には約 10 時間かかります。通常、さまざまなパラメーターを使用していくつかの独立した計算を実行する必要があります。その方法は、独立した計算をそれぞれ順番に実行することです。そのため、最終的に 10 個の独立した計算がある場合、合計 CPU 時間は 100h になります。

より迅速な方法は、クラスター マシン上の異なるプロセッサを使用して 10 個の独立した計算を同時に実行することですが、問題は、特定の計算で、既に開かれている特定の ascii ファイルを開いてデータを読み取る必要がある場合です。別の計算で使用されている場合、コードは明らかにエラーを返します。

特定の ascii ファイルが別の計算で既に使用されているかどうかを確認する方法があるかどうか、およびその場合、ascii ファイルが最終的に閉じられるまでコードに待機するように依頼する方法があるかどうか疑問に思います。

どんな助けでも大いに役立ちます。よろしくお願いします。

オバマコーク。

4

2 に答える 2

1

2 つのプロセスが同じファイルを読み取ることができる必要があります。おそらくaction="read"、オープンステートメントで役立つかもしれません。ファイルは人間が読める必要がありますか? I/O は、フォーマットされていない (バイナリと呼ばれることもある) ファイルを使用すると、はるかに高速になる可能性が非常に高くなります。

PS OS が複数読み取りアクセスをサポートしていない場合は、独自のロック システムを作成する必要がある場合があります。プロセスが開いて、どのファイルが使用されているかどうかを確認し、そのリストを更新するマスター ファイルを作成します。チェックまたは更新後、すぐに閉じます。この読み取り/書き込みファイルの競合を処理するiostatには、open ステートメントで使用し、エラーが発生した場合は遅延後に再試行します。

于 2013-09-18T10:09:27.507 に答える
1

これが古いスレッドであることは知っていますが、自分のコードでも同じ問題に苦しんでいます。

私の最初の試みは、特定のプロセス (マスターなど) で変数を作成し、片側パッシブ MPI を使用してこの変数に排他的にアクセスすることでした。これは派手でうまく機能しますが、新しいバージョンの MPI でのみ使用できます。

また、私のコードはREADWRITE、他のプロセスでも開かれているファイルを (ステータス付きで) 開いても問題ないように見えました。

したがって、プログラムがファイルにアクセスできる場合、最も簡単な回避策は、ここで説明されているように、外部ロック ファイルを使用することです。あなたの場合、コードは次のようになります。

  • プロセスはステートメントを使用してロック ファイルが存在するかどうかをチェックしNEWます。ファイルが既に存在する場合、このステートメントは失敗します。次のようになります。

    file_exists = .true.
    do while (file_exists)
        open(STATUS='NEW',unit=11,file=lock_file_name,iostat=open_stat)
        if (open_stat.eq.0) then
            file_exists = .false.
            open(STATUS='OLD',ACTION=READWRITE',unit=12,file=data_file_name,iostat=ierr)
            if (ierr.ne.0) stop
        else
            call sleep(1)
        end if
    end do
    
  • ファイルは、現在のプロセスによって排他的に開かれます。読み取り、書き込みなど、必要な操作を行います。

  • 完了したら、データ ファイルを閉じ、最後にロック ファイルを閉じます。

    close(12,iostat=ierr)
    if (ierr.ne.0) stop
    close(11,status='DELETE',iostat=ierr)
    if (ierr.ne.0) stop
    
  • データ ファイルは、他のプロセスに対して再びロック解除されます。

これが同じ問題を抱えている他の人々に役立つことを願っています。

于 2015-10-05T08:47:53.390 に答える