从多个线程调用OPEN语句的子例程

时间:2013-12-15 18:25:29

标签: multithreading io fortran

我有一个Fortran子例程,它在代码中的某处有一些I / O语句用于输出目的:

 OPEN(16, FILE = "C:/Abaqus_JOBS/failureUEL.txt", 
1   action = "WRITE", status = "replace", IOSTAT=ios)
 IF (ios.EQ.0) THEN 
     WRITE(16,*)  something

我将它与使用它进行一些计算的程序联系起来。

现在,当我使用CPU的单核时,这种方法很有效。如果我使用多个核心运行它,我会收到一个未知错误,程序突然结束。当程序结束时,我只收到一条消息,说明子程序中发生错误。

我的错误与以下事实有关:虽然一个核心可能正在打开文件并向其写入信息,但另一个核心可能想要执行相同的操作,这可能会导致错误。你们有什么感想?


对我有用的是什么:

                cpuid = 1
                WRITE(filename, '(a25,i2.2,a4)') 
     1           "C:/Abaqus_JOBS/failureUEL",cpuid,".txt"
                OPEN(16,FILE=filename,
     1   action = "WRITE", status = "replace", IOSTAT=ios)
                IF (ios.EQ.0) THEN 
                    GOTO 601
                ELSE
  602               cpuid = cpuid + 1
                    WRITE(filename, '(a25,i2.2,a4)') 
     1           "C:/Abaqus_JOBS/failureUEL",cpuid,".txt"
                    OPEN(16,FILE=filename,
     1   action = "WRITE", status = "replace", IOSTAT=ios1)
                    IF (ios1.EQ.0) THEN
                        GOTO 601
                    ELSE
                        GOTO 602
                    ENDIF
                ENDIF
  601           WRITE(16,*)  something

1 个答案:

答案 0 :(得分:1)

您的问题取决于您使用的并行化库的类型。

如果您使用OpenMP并行化代码,我建议通过单个线程执行I / O,并使用SINGLE pragma

!$OMP SINGLE
open(16, FILE = "C:/Abaqus_JOBS/failureUEL.txt", &
  action = "WRITE", status = "replace", IOSTAT=ios)
if (ios.EQ.0) then
     write(16,*)  something
endif
!$OMP END SINGLE

如果您使用MPI并行化代码,则必须为每个进程编写一个文件

write(numfile, '(i10)') myrank 
open(16, FILE = "C:/Abaqus_JOBS/failureUEL."//trim(numfile)//".txt", &
  action = "WRITE", status = "replace", IOSTAT=ios)
if (ios.EQ.0) then 
     write(16,*)  something
endif

myrank您正在使用的通信器中的进程级别,例如numfile一个character(len=*)

您还可以选择使用并行I / O库来编写单个文件(MPI-IO,并行HDF5,并行NetCDF ...)。