前提・実現したいこと
並列計算の初学者です.
他のプログラムにより出力された複数のデータを,各ステップ番号ごとに一つのファイルに結合するプログラムを作成しました.
この結合処理の速度を向上させるため,OpenMPによるスレッド並列を試みました.
このプログラム実行したとき,いくつかのステップの結合処理は成功したのですが,並列処理を行うステップ数を多く指定した場合,エラーが出力されました.
複数回テスト実行を行っていますが,エラー書き出しのタイミングはそれぞれ異なっています.
これはプログラムにおけるOpenMPの指定方法に誤りがあるのでしょうか.
ご回答宜しくお願い致します.
発生している問題・エラーメッセージ
forrtl: File exists forrtl: severe (10): cannot overwrite existing file, unit 12, file ./combine/./../100123/UVWPT_35_100123step_rank037
該当のソースコード
fortran
1 2 Program main 3 implicit none 4 include "omp_lib.h" 5 6!-------Definition 7 8 integer :: myid, nthreads 9 integer :: i, j, k, yy, zz, pp, xd, nt, x, y, nnt 10 Real*4, dimension(:,:,:), allocatable :: U,V 11 Real*4, dimension(:,:,:), allocatable :: Data_p1 12 13 Integer :: my_rank 14 integer :: js, je, ks, ke 15 integer, Parameter :: Ny = 701 16 integer, Parameter :: Nz = 701 17 Integer, Parameter :: p_10 = 398 18 Integer, Parameter :: p_15 = 706 19 Character( len = 45 ) :: IN_NAME, INPUT_NAME 20 21! nthreads = omp_get_num_threads() 22 23!$omp parallel default(private) 24!$omp do 25 Do nt = 119, 150, 1 26 27 nnt = nt + 100000.0E0 28 29 myid = omp_get_thread_num() 30 31 Write(6,*) myid, nt 32 33 34 x = 10.0E0 + myid 35 36 Do xd = 10, 15, 5 37 If ( xd .eq. 10 ) then ; pp= p_10 38 else if ( xd .eq. 15 ) then ; pp= p_15; End if 39 40 Allocate ( U (pp- 5 :pp+ 5 ,1:Ny,1:Nz)) 41 Allocate ( V (pp- 5 :pp+ 5 ,1:Ny,1:Nz)) 42 43 U = 0.0d0 44 V = 0.0d0 45 46 Do my_rank = 0, 639, 1 47 48 Write(INPUT_NAME, '(a,i6.6,a,i2.2,a,i6.6,a,i3.3)')'./../',nnt,'/UV_',xd,'_',nnt,'step_rank',my_rank 49 Open( x,File = INPUT_NAME, Form = 'unformatted', status = 'old') 50 51 52 js = 0.0E0 53 je = 0.0E0 54 ks = 0.0E0 55 ke = 0.0E0 56 57 zz = my_rank / 32 58 yy = mod( my_rank, 32) 59 60 if ((my_rank .ge. 0) .and. (my_rank .le. 31)) then; ks = 1 ; ke = 35*(zz+1) 61 else if ((my_rank .ge. 32) .and. (my_rank .le. 607)) then; ks = 35*zz+1; ke = 35*(zz+1) 62 else if ((my_rank .ge. 608) .and. (my_rank .le. 639)) then; ks = 35*zz+1; ke = Nz ; End if 63 64 if ( yy .eq. 0) then; js = 1 ; je = 22*(yy+1) 65 else if ((yy .ge. 1) .and. (yy .le. 30)) then; js = 22*yy+1; je = 22*(yy+1) 66 else if ( yy .eq. 31) then; js = 22*yy+1; je = Ny ; End if 67 68 Allocate (Data_p1 (pp- 5 :pp+5 ,js:je,ks:ke)) 69 70 71 Data_p1 = 0.0d0 72 73 !--- U --- 74 Read(x) Data_p1 75 Do k = ks, ke,1 76 Do j = js, je,1 77 Do i = pp-5, pp+5,1 78 U(i,j,k) = Data_p1(i,j,k) 79 End Do; End Do; End Do 80 !--- V --- 81 Read(x) Data_p1 82 Do k = ks, ke,1 83 Do j = js, je,1 84 Do i = pp-5, pp+5,1 85 V(i,j,k) = Data_p1(i,j,k) 86 End Do; End Do; End Do 87 88 Deallocate ( Data_p1 ) 89 End do 90 91 Close(x) 92 93!====出力======= 94 95 y = x + 20.0E0 96 97 Write(IN_NAME, '(a,i2.2,a,i6.6,a)')'UV_',xd,'_',nnt,'step' 98 Open( y,File = IN_NAME, Form = 'unformatted', status = 'unknown') 99 100 Write(y) U 101 Write(y) V 102 103 Deallocate ( U,V ) 104 105 close(y) 106 107 End do 108 109 End do 110!$omp end do 111!$omp end parallel 112 113 Stop 114 End Program 115 116
該当のスクリプト
#! /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

下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/02/18 10:44
2022/03/09 00:12