質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
並列処理

複数の計算が同時に実行される手法

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

受付中

OpenMPを用いた並列処理内でのファイル出力エラー

DaiFu
DaiFu

総合スコア2

並列処理

複数の計算が同時に実行される手法

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

1回答

0リアクション

0クリップ

405閲覧

投稿2022/02/17 05:46

編集2022/02/22 03:34

前提・実現したいこと

並列計算の初学者です.
他のプログラムにより出力された複数のデータを,各ステップ番号ごとに一つのファイルに結合するプログラムを作成しました.
この結合処理の速度を向上させるため,OpenMPによるスレッド並列を試みました.
このプログラム実行したとき,いくつかのステップの結合処理は成功したのですが,並列処理を行うステップ数を多く指定した場合,エラーが出力されました.
複数回テスト実行を行っていますが,エラー書き出しのタイミングはそれぞれ異なっています.
これはプログラムにおけるOpenMPの指定方法に誤りがあるのでしょうか.

ご回答宜しくお願い致します.

発生している問題・エラーメッセージ

forrtl: File exists forrtl: severe (10): cannot overwrite existing file, unit 12, file ./combine/./../100123/UVWPT_35_100123step_rank037

該当のソースコード

fortran

Program main implicit none include "omp_lib.h" !-------Definition integer :: myid, nthreads integer :: i, j, k, yy, zz, pp, xd, nt, x, y, nnt Real*4, dimension(:,:,:), allocatable :: U,V Real*4, dimension(:,:,:), allocatable :: Data_p1 Integer :: my_rank integer :: js, je, ks, ke integer, Parameter :: Ny = 701 integer, Parameter :: Nz = 701 Integer, Parameter :: p_10 = 398 Integer, Parameter :: p_15 = 706 Character( len = 45 ) :: IN_NAME, INPUT_NAME ! nthreads = omp_get_num_threads() !$omp parallel default(private) !$omp do Do nt = 119, 150, 1 nnt = nt + 100000.0E0 myid = omp_get_thread_num() Write(6,*) myid, nt x = 10.0E0 + myid Do xd = 10, 15, 5 If ( xd .eq. 10 ) then ; pp= p_10 else if ( xd .eq. 15 ) then ; pp= p_15; End if Allocate ( U (pp- 5 :pp+ 5 ,1:Ny,1:Nz)) Allocate ( V (pp- 5 :pp+ 5 ,1:Ny,1:Nz)) U = 0.0d0 V = 0.0d0 Do my_rank = 0, 639, 1 Write(INPUT_NAME, '(a,i6.6,a,i2.2,a,i6.6,a,i3.3)')'./../',nnt,'/UV_',xd,'_',nnt,'step_rank',my_rank Open( x,File = INPUT_NAME, Form = 'unformatted', status = 'old') js = 0.0E0 je = 0.0E0 ks = 0.0E0 ke = 0.0E0 zz = my_rank / 32 yy = mod( my_rank, 32) if ((my_rank .ge. 0) .and. (my_rank .le. 31)) then; ks = 1 ; ke = 35*(zz+1) else if ((my_rank .ge. 32) .and. (my_rank .le. 607)) then; ks = 35*zz+1; ke = 35*(zz+1) else if ((my_rank .ge. 608) .and. (my_rank .le. 639)) then; ks = 35*zz+1; ke = Nz ; End if if ( yy .eq. 0) then; js = 1 ; je = 22*(yy+1) else if ((yy .ge. 1) .and. (yy .le. 30)) then; js = 22*yy+1; je = 22*(yy+1) else if ( yy .eq. 31) then; js = 22*yy+1; je = Ny ; End if Allocate (Data_p1 (pp- 5 :pp+5 ,js:je,ks:ke)) Data_p1 = 0.0d0 !--- U --- Read(x) Data_p1 Do k = ks, ke,1 Do j = js, je,1 Do i = pp-5, pp+5,1 U(i,j,k) = Data_p1(i,j,k) End Do; End Do; End Do !--- V --- Read(x) Data_p1 Do k = ks, ke,1 Do j = js, je,1 Do i = pp-5, pp+5,1 V(i,j,k) = Data_p1(i,j,k) End Do; End Do; End Do Deallocate ( Data_p1 ) End do Close(x) !====出力======= y = x + 20.0E0 Write(IN_NAME, '(a,i2.2,a,i6.6,a)')'UV_',xd,'_',nnt,'step' Open( y,File = IN_NAME, Form = 'unformatted', status = 'unknown') Write(y) U Write(y) V Deallocate ( U,V ) close(y) End do End do !$omp end do !$omp end parallel Stop End Program

該当のスクリプト

#! /bin/sh #------ pjsub option -------# #PJM -L rscgrp=cl-single #PJM -L node=1 #PJM --mpi proc=1 #PJM --mpi max-proc-per-node=1 #PJM -L elapse=00:60:00 #PJM -j #PJM -N job_1 #------ Program execution -------# module purge module load intel export OMP_NUM_THREADS=20 cd ./combine time ./a.out

コンパイラー

ifort -g -O2 -qopenmp -axCORE-AVX512 file.f90

試したこと

コンパイル時のオプションに問題があると考え,オプションを取捨選択してテスト実行を行ったが不可.
また,並列計算時の指定コアがCPUをまたぐことに問題があると考え,1CPU内の最大コア数を指定したが,同様のエラー出力.
読み込む際のファイルステータスを "unknown" から "old" に変更.

補足情報(FW/ツールのバージョンなど)

Xeon Gold 6230×4 (Cascade Lake) 1ノードあたり20コア、2.10-3.90 GHz

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

並列処理

複数の計算が同時に実行される手法

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。