3

这段代码在 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是一个整数,甚至可以写出它的值。但它不能nallocate语句中使用。(顺便说一句,我对语句的格式进行了多种尝试,read但无济于事。)这是怎么回事?

针对一些评论的更新:

首先,我有可能发现了一个错误吗?我把它移到另一个 Cray 平台上,它运行得很好。两台机器上的 Cray 版本都是 12.0.3。

其次,我的构建非常简单,只是

ftn simplarray.F90

我正在登录节点上构建和编译,这些节点是 Intel Broadwells。

4

0 回答 0