You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用gfortran+mpich时Coarray Fortran传递分布式参数段错误

问题分析与解决:Coarray Fortran在gfortran+mpich环境下的段错误与性能问题

核心问题拆解

  1. 段错误原因:直接将远程数组B(:,:)[l]作为matmul的参数时,gfortran的Coarray实现可能无法正确处理远程数组到内部函数的隐式传递,导致内存访问越界。
  2. 远程数组复制缓慢:循环中反复直接访问远程数组B(:,:)[l]会触发多次零散的MPI通信,累积较高的通信延迟与开销。
  3. 结束时的MPI错误:"unexpected tag-receive descriptor"通常源于隐式远程访问的通信资源未正确释放,或是编译器与MPI库的兼容性bug。

解决方案

1. 显式复制远程数组到局部临时变量

避免直接传递远程数组到matmul,先将远程数据复制到局部数组,再传入函数。这既解决了段错误问题,也能减少重复远程访问的开销。

2. 修复程序终止逻辑

原代码中当n无法被p整除时仅打印提示但未终止,会导致后续数组分配出错,需添加stop语句。

3. 优化通信性能

通过一次复制将远程数组加载到局部内存,避免循环内多次远程通信,降低延迟开销。

修改后的完整代码

program main
    implicit none

    integer :: n, p, l
    real(KIND=8), allocatable :: A(:,:)[:], B(:,:)[:], C(:,:)[:]
    real(KIND=8), allocatable :: B_local(:,:)
    character(len=12), dimension(:), allocatable :: args
    integer :: cpu_count, cpu_count2, count_rate, count_max

    allocate(args(1))
    call get_command_argument(1, args(1))
    read (unit=args(1),fmt=*) n

    p = num_images()

    if (modulo(n, p) /= 0) then
        write (*, *) 'Please make sure n divides p'
        stop
    end if

    allocate(A(n / p, n)[*])
    allocate(B(n / p, n)[*])
    allocate(C(n / p, n)[*])
    allocate(B_local(n/p, n))

    A = 1
    B = 1
    C = 0

    sync all
    call system_clock(cpu_count, count_rate, count_max)

    do l = 1, num_images()
        B_local = B(:,:)[l]
        C = C + matmul(A(:, 1 + (l - 1) * n / p: l * n / p), B_local)
    end do

    sync all
    call system_clock(cpu_count2, count_rate, count_max)

    if (this_image() .eq. 1) then
        write (*, *) 2.0 * n * n * n / (real(cpu_count2 - cpu_count) / &
                    count_rate) / 1000000000.0
    end if

    deallocate(A, B, C, B_local, args)
end program main

额外建议

  • 若问题仍存在,尝试更新gfortran与mpich到最新版本,修复已知的Coarray实现bug。
  • 对于更大规模的计算,可考虑使用co_broadcast等批量通信操作进一步优化远程数据传输效率。

内容的提问来源于stack exchange,提问作者asdfldsfdfjjfddjf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 20:05:08