这个程序崩溃了Illegal instruction: 4
在 MacOSX Lion 和 ifort (IFORT) 12.1.0 20111011 上
program foo
real, pointer :: a(:,:), b(:,:)
allocate(a(5400, 5400))
allocate(b(5400, 3600))
a=1.0
b(:, 1:3600) = a(:, 1:3600)
print *, a
print *, b
deallocate(a)
deallocate(b)
end program
相同的程序适用于 gfortran。我没有看到任何问题。有任何想法吗 ?展开副本并对列执行显式循环在两个编译器中都有效。
请注意,使用可分配而不是指针我没有问题。
无论语句是否位于模块内部,行为都是相同的。
我在 ifort (IFORT) 12.1.3 20120130 上确认了相同的行为。
显然,Linux和ifort 12.1.5没有出现问题
我尝试使用以下链接选项增加堆栈大小
ifort -Wl,-stack_size,0x40000000,-stack_addr,0xf0000000 test.f90
但我仍然遇到同样的错误。增加 ulimit -s 来解决同样的问题。
编辑2:我做了一些更多的调试,显然问题发生在数组拼接操作时
b(:, 1:3600) = a(:, 1:3600)
涉及可疑接近 16 M 数据的值。
我正在比较生成的操作码,但如果有一种方法可以查看更具沟通性的中间代码形式,我将很乐意欣赏。