【问题标题】:What is the proper way to benchmark Julia code that uses MPI?对使用 MPI 的 Julia 代码进行基准测试的正确方法是什么?
【发布时间】:2020-11-28 22:38:55
【问题描述】:

我正在学习使用 MPI 编写 Julia 代码,我想对 this 基本发送/接收示例进行基准测试。我对示例代码稍作修改以包含时间。

using MPI

function executeSendReceive(n)
    comm = MPI.COMM_WORLD
    rank = MPI.Comm_rank(comm)
    size = MPI.Comm_size(comm)

    dst = mod(rank+1, size)
    src = mod(rank-1, size)

    N = 2^n

    send_mesg = Array{Int8}(undef, N)
    recv_mesg = Array{Int8}(undef, N)

    fill!(send_mesg, Int8(rank))

    rreq = MPI.Irecv!(recv_mesg, src,  src+32, comm)

    print("$rank: Sending   $rank -> $dst = $send_mesg\n")
    sreq = MPI.Isend(send_mesg, dst, rank+32, comm)

    stats = MPI.Waitall!([rreq, sreq])

    print("$rank: Received $src -> $rank = $recv_mesg\n")

    MPI.Barrier(comm)
end

MPI.Init()
@time executeSendReceive(2)
MPI.Finalize()

但是,当我使用 2 个进程在终端中运行脚本时,我得到一些看起来很乱的输出。

0: Sending   0 -> 1 = Int8[0, 0, 0, 0]
1: Sending   1 -> 0 = Int8[1, 1, 1, 1]
0: Received 1 -> 0 = Int8[1, 1, 1, 1]
1: Received 0 -> 1 = Int8[0, 0, 0, 0]
    0.077899 seconds0.077898 seconds (3.37 k allocations: 187.234 KiB) (3.37 k allocations: 187.234 KiB)

如何解决此格式问题?我还想对几个消息大小重复该过程,但我不知道如何操作@time 给出的输出。有人能指出我正确的方向吗?

【问题讨论】:

    标签: julia mpi benchmarking


    【解决方案1】:

    我的第一个建议是看看这里:https://www.geeksforgeeks.org/benchmarking-in-julia/ 在一些更多的基准测试例程。使用@time 通常不是一种可靠的基准测试方法,除非您试图对性能有一个非常高层次的了解。

    您的输出中的单行格式似乎也是您构建和随后运行代码的方式的结果。 尝试在没有这两个进程的情况下运行它或在@time 之后添加println()

    无论哪种方式,您可能正在寻找的是:https://docs.julialang.org/en/v1/base/base/#Base.@timed,它允许您使用并打印出可能与您相关的计时信息的特定部分。我建议查看上面该链接中的文档,因为它具有所有相关功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-25
      • 2013-03-10
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 2015-02-01
      相关资源
      最近更新 更多