尝试使用Fortran中的execute_command_line内部函数创建目录时遇到运行时错误。Ifort(18.0.3 20180410)和gfortran(4.8.5)均会发生错误。这是一个最小的示例,该示例因我使用的任何编译标志而失败:
PROGRAM directory_test
IMPLICIT NONE
INTEGER :: cstat, estat, i, j
CHARACTER(LEN=100) :: cmsg
REAL, DIMENSION(:,:), ALLOCATABLE :: field
INTEGER, PARAMETER :: fieldsize = 80000
allocate(field(fieldsize,fieldsize))
do j=1, fieldsize
do i=1, fieldsize
field(i,j) = real(i+j)
end do
end do
call execute_command_line('mkdir -p newdir', WAIT=.true., EXITSTAT=estat, CMDSTAT=cstat, CMDMSG=cmsg)
write(*,*) 'estat: ', estat
write(*,*) 'cstat: ', cstat
write(*,*) 'cmsg: ', cmsg
END PROGRAM directory_test
Run Code Online (Sandbox Code Playgroud)
输出ifort:
estat:0
cstat:124
cmsg:提供给EXECUTE_COMMAND_LINE的命令无效
输出gfortran:
estat:-520880432
cstat:1
cmsg:无法获得命令语言解释器的终止状态
要注意的是:只要数组大小足够小,程序就可以正常运行。对我来说,阈值大约是所用物理内存的一半(如果您想尝试代码,请调整“ fieldsize”的值)。如果数组大于该数组,则会发生错误。如果数组较小,则代码将正确执行,并创建目录。我用来测试的机器都具有2个物理CPU和128GB-256GB的RAM。
我究竟做错了什么?
操作系统:Linux,Opensuse 42.3
shell:bash
文件系统:Ext4
编辑:问题不仅仅限于“ …
虽然将 3D 坐标转换为 z 顺序曲线相对简单(Fortran 中的高效 z 顺序转换),但我很难理解使用不同空间填充曲线(例如 Peano 或 Hilbert)的数学原理。任何关于执行转换的实际代码如何看起来的提示将不胜感激。目标是拥有一个子例程,该子例程将 xyz 坐标作为输入,并进行任何必要的归一化,并返回空间填充曲线的索引。
子程序(x,y,z,空间填充索引)
与此相关的是:我读到有很多方法可以在 3D 空间中定义希尔伯特曲线,就局部性而言,哪种方法最好?如果这个问题有一个明确的答案的话……
该应用程序将对笛卡尔计算网格中的单元进行重新排序,目的是在单元访问其邻居单元时增加缓存命中率。