r****y 发帖数: 1437 | 1 多年不搞fortran了,这次老革命碰到新问题了
想移植一个SGI Altix/Ifort上使用的并行程序到AMD Operton/pgf90上,
编译连接毫无问题,但是一运行就出现下列错误并异常终止
0: ALLOCATE: 18446744073709551615 bytes requested; not enough memory
18446744073709551615 = 2^64, 程序里并没有要求allocate
如此多的内存, 不知道为什么会出现这个问题
把compiler的options一个个试了试,无论怎么编译,都是
同样的错误。
哪位高见,指点指点。谢先。 |
j**u 发帖数: 6059 | 2 什么并行?multithreads 还是multi processors?
调试的时侯是哪一步allocate内存的?
俺虽然不懂fortran,如果是并行程序,希望可以帮上一点忙。
【在 r****y 的大作中提到】 : 多年不搞fortran了,这次老革命碰到新问题了 : 想移植一个SGI Altix/Ifort上使用的并行程序到AMD Operton/pgf90上, : 编译连接毫无问题,但是一运行就出现下列错误并异常终止 : 0: ALLOCATE: 18446744073709551615 bytes requested; not enough memory : 18446744073709551615 = 2^64, 程序里并没有要求allocate : 如此多的内存, 不知道为什么会出现这个问题 : 把compiler的options一个个试了试,无论怎么编译,都是 : 同样的错误。 : 哪位高见,指点指点。谢先。
|
i**g 发帖数: 134 | 3 可能不同的系统和编译器对于初值的处理不同,导致allocate时的变量大小
同原来不同?
或者浮点比较执行不同,导致变量值不同?
2^64是long integer了?所有位都是1?
追踪一下控制allocate大小的变量的值的变化?
【在 r****y 的大作中提到】 : 多年不搞fortran了,这次老革命碰到新问题了 : 想移植一个SGI Altix/Ifort上使用的并行程序到AMD Operton/pgf90上, : 编译连接毫无问题,但是一运行就出现下列错误并异常终止 : 0: ALLOCATE: 18446744073709551615 bytes requested; not enough memory : 18446744073709551615 = 2^64, 程序里并没有要求allocate : 如此多的内存, 不知道为什么会出现这个问题 : 把compiler的options一个个试了试,无论怎么编译,都是 : 同样的错误。 : 哪位高见,指点指点。谢先。
|
r****y 发帖数: 1437 | 4 呵呵,花了我一个晚上外加一个上午,终于从这个巨大无比的程序中将
此bug搞定。
结果不是multi-threads/mpi的问题,一个小bug导致了如此的复杂故事
(btw程序不是我写的,是一个大大的group, 100号人,developed)
把这个小bug改写在这,大家娱乐一下
program main
character(80) dflnm
character(80) restart_name
dflnm = 'INPUT/fv_rst.res'
print *, trim(dflnm(LEN_TRIM(dflnm):LEN_TRIM(dflnm)-2))
end
用ifort, pgf90, 都能编译通过
dflnm(LEN_TRIM(dflnm):LEN_TRIM(dflnm)-2) 显然错了,下标
应该是增序,应该是
LEN_TRIM(dflnm)-2:LEN_TRIM(dflnm)
【在 i**g 的大作中提到】 : 可能不同的系统和编译器对于初值的处理不同,导致allocate时的变量大小 : 同原来不同? : 或者浮点比较执行不同,导致变量值不同? : 2^64是long integer了?所有位都是1? : 追踪一下控制allocate大小的变量的值的变化?
|