2401_82508090 2024-12-20 16:21 采纳率: 8%
浏览 54

Fortran程序运行报错

现在在运行一个fortran语言写的程序包,其中文件是程序自动生成的。但是现在运行报错为


finished writing fpm; starting plots
forrtl: severe (64): input conversion error, unit 38, file /public/home/yzp/aorsa0/run/out38
Image PC Routine Line Source
xaorsa2d 0000000000835668
xaorsa2d 000000000085DE59
xaorsa2d 000000000085BAF9
xaorsa2d 000000000058C738
xaorsa2d 000000000065A37A
xaorsa2d 000000000040FDE2
libc-2.17.so 00002B0A426E8505 __libc_start_main
xaorsa2d 000000000040FCE9

===================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= RANK 1 PID 136428 RUNNING AT node7
= KILLED BY SIGNAL: 9 (Killed)
=================================================================


  • 写回答

2条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2024-12-21 01:01
    关注
    让【道友老李】来帮你解答,本回答参考通义千问大模型编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    # 一、问题分析

    (一)错误类型

    从报错信息forrtl: severe (64): input conversion error, unit 38, file /public/home/yzp/aorsa0/run/out38来看,这是一个Fortran I/O操作中的严重错误。错误代码64通常表示输入转换错误,意味着在尝试读取或写入文件时,数据的格式与预期不符。

    (二)可能原因

    1. 文件格式问题
      • 文件out38的内容格式可能不符合程序读取该文件时所期望的格式。例如,程序可能期望一个整数但实际文件中是一个浮点数,或者数据的分隔符不正确等。
    2. 文件权限问题
      • 如果程序没有对/public/home/yzp/aorsa0/run/out38文件的正确读取或写入权限,也会导致这种I/O错误。虽然从报错信息看更倾向于格式问题,但也需要检查权限。
    3. 并行计算相关问题(根据后续信息推测)
      • 后续报错信息提到BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSESRANK 1 PID 136428 RUNNING AT node7 KILLED BY SIGNAL: 9 (Killed)。这表明在并行计算过程中,某个进程被杀死了。信号9通常是系统管理员或其他进程强制终止进程的信号,可能是由于资源限制(如内存不足、运行时间过长等),也可能是并行通信出现问题导致某些进程等待超时等。

    二、解决方案

    (一)检查文件内容和格式

    1. 查看文件内容
      • 使用文本编辑器(如vi、vim等)打开/public/home/yzp/aorsa0/run/out38文件,检查文件中的数据是否符合程序预期的格式。例如,如果程序是按行读取整数,确保每行确实是一个有效的整数。
      • 示例:假设程序期望文件中每一行是一个以空格分隔的三个整数,而文件内容为:
        1 2 3
        4.5 6 7
        

        那么第二行的第一个数字4.5就会导致输入转换错误。

    2. 检查文件生成逻辑
      • 查看生成该文件的程序部分,确保数据是以正确的格式写入文件的。例如,在Fortran中,如果使用write(*,*)语句写入数据,默认可能会有额外的空格或格式字符,要确保这些不会影响后续读取操作。如果是按照特定格式写入,如:
        open(unit = 38,file='/public/home/yzp/aorsa0/run/out38',status='unknown')
        do i = 1,n
         write(38,'(i5,f10.5,i5)') a(i),b(i),c(i)
        enddo
        close(38)
        

        那么读取时也要按照(i5,f10.5,i5)的格式进行读取,否则就会出现转换错误。

    (二)检查文件权限

    1. 查看文件权限
      • 在Linux系统中,可以使用ls -l /public/home/yzp/aorsa0/run/out38命令查看文件权限。确保当前运行程序的用户对该文件有读写权限。例如,输出结果为:
        -rw-r--r-- 1 user group 1234 Jan 1 12:34 out38
        

        如果程序运行用户不是user且没有对应的读写权限(如只读权限r--),则需要修改权限。可以使用chmod命令修改权限,如chmod 664 out38(使同组用户可读写,其他用户可读)或者将文件所有者改为程序运行用户。

    2. 检查目录权限
      • 不仅要检查文件本身的权限,还要检查其所在目录/public/home/yzp/aorsa0/run/的权限,确保程序能够访问该目录下的文件。可以使用ls -ld /public/home/yzp/aorsa0/run/查看目录权限,必要时使用chmod修改目录权限。

    (三)处理并行计算问题(如果存在)

    1. 检查资源分配
      • 确保并行计算任务有足够的资源(如内存、CPU时间等)。如果是在集群上运行,查看作业调度系统的设置,例如Slurm、PBS等。对于内存限制,可以在作业提交脚本中指定更大的内存需求。例如,在Slurm中:
        #SBATCH --mem=8G
        
    2. 检查并行通信代码
      • 如果程序中有MPI(Message Passing Interface)等并行通信库的调用,检查通信代码是否正确。例如,确保发送和接收缓冲区大小匹配,通信标签正确等。可以使用调试工具(如mpiP、Vampir等)来分析并行程序的通信情况。
    3. 日志分析
      • 查看并行计算相关的日志文件,寻找更多关于进程被杀死的原因。例如,在集群环境中,作业调度系统可能会生成日志记录作业的运行状态,包括是否有资源超限等情况。

    三、案例

    (一)文件格式问题案例

    1. 问题描述
      • 有一个Fortran程序用于读取包含学生成绩的文件,文件名为scores.txt。程序期望文件中每一行是一个学生的姓名(字符串,长度不超过20个字符)和成绩(整数),中间用逗号分隔。但是程序运行时报输入转换错误。
    2. 解决过程
      • 检查scores.txt文件内容,发现其中有一行数据为:
        张三,90.5
        

        这里成绩是浮点数,而程序期望的是整数。修改文件内容为:

        张三,90
        

        或者修改程序读取格式为可以读取浮点数的形式,如:

        character(len=20) :: name
        real :: score
        open(unit = 10,file='scores.txt',status='old')
        do while (.true.)
         read(10,*,end = 100,err = 200) name,score
         ! 处理name和score
        enddo
        100 continue
        close(10)
        stop
        200 print*,'Error in reading file'
        

    (二)并行计算问题案例

    1. 问题描述
      • 一个基于MPI的Fortran程序在集群上运行时,部分进程被杀死,导致整个程序无法正常完成。
    2. 解决过程
      • 检查作业调度系统(Slurm)的日志,发现是由于内存超限导致部分进程被杀死。原来程序中有一个数组分配了过多的内存,修改程序减少不必要的内存分配。同时,在作业提交脚本中增加了内存请求量:
        #SBATCH --mem=16G
        

        并重新提交作业后,程序正常运行。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月20日