我有一个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
答案 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 ...)。