这段代码在 Intel 和 GNU 下编译和运行得很好:
program simplarray
implicit none
real, allocatable, dimension(:,:,:) :: a
character(len=32) :: cmdarg
integer :: n = 0
call get_command_argument(1, cmdarg)
read(cmdarg,'(i)') n
print '("n=",i5)', n
call flush(6)
allocate(a(n,n,2))
print '("a is dimensioned ", 3i5)', shape(a)
deallocate(a)
end program
输出:
> ./a.out 50
n= 50
a is dimensioned 50 50 2
但克雷一点也不喜欢:
> ./a.out 10
n= 10
Illegal instruction (core dumped)
现在,问题来了:如果我用简单的 n 设置替换命令行输入,一切都很好:
integer :: n = 10
! call get_command_argument(1, cmdarg)
! read(cmdarg,'(i)') n
现在我明白了
./a.out
n= 10
a is dimensioned 10 10 2
更新:尝试从常规文本文件中读取:
integer :: n
open(unit=11, file='size.txt')
read(11,*) n
close(11)
克雷也不喜欢那样。同样的问题。
因此,如果n
来自命令行,Cray 可以读取n
. 它认为n
是一个整数,甚至可以写出它的值。但它不能n
在allocate
语句中使用。(顺便说一句,我对语句的格式进行了多种尝试,read
但无济于事。)这是怎么回事?
针对一些评论的更新:
首先,我有可能发现了一个错误吗?我把它移到另一个 Cray 平台上,它运行得很好。两台机器上的 Cray 版本都是 12.0.3。
其次,我的构建非常简单,只是
ftn simplarray.F90
我正在登录节点上构建和编译,这些节点是 Intel Broadwells。