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

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

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

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

Linux

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

FORTRAN

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

Q&A

1回答

799閲覧

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

DaiFu

総合スコア2

並列処理

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

Linux

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

FORTRAN

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

0グッド

0クリップ

投稿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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ファイル入出力のような処理は !$omp single を使います。同期をとることになるので write の位置について再考が必要かもしれません。

参考:
https://www.nag-j.co.jp/openMP/openMPSingleDirective.html
http://www.eccse.kobe-u.ac.jp/assets/images/simulation_school/kobe-hpc-spring-school-2018/fdf9ba9633c5337eaea0512d534f199e2e99b8e5.pdf

投稿2022/02/18 09:33

編集2022/02/18 09:35
chirimen

総合スコア189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DaiFu

2022/02/18 10:44

ご回答いただきありがとうございます. !$omp single を使用した場合,出力工程は並列化されず一ファイルのみの出力になると思います. 私の目的といたしましては,並列化された各プロセスが異なるファイルを読み込み出力したいと思っております. ファイル出力はOpenMPを用いた並列では不可能なのでしょうか. 何度かテスト実行を行っているですが,1ステップも実行できずに終わるときもあれば,10ステップ程度進む場合もあります.
chirimen

2022/03/09 00:12

デバッグになりますが、下記について確認してみるとよいと思います。 ・エラーの発生しているプログラム上の位置 ・ユニット番号が意図通りになっているか write 文でエラーが生じているとすると、エラーメッセージ中の unit 12 は意図通りではないのではありませんか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問