该程序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 数据的值。
我正在比较生成的操作码,但如果有一种方法可以查看更具交流性的中间代码形式,我将不胜感激。