Каков правильный способ тестирования кода Julia, который использует MPI?

#julia #mpi #benchmarking

#джулия #mpi #сравнительный анализ

Вопрос:

Я учусь писать код Julia с использованием MPI, и я хотел бы сравнить этот базовый пример отправки / получения. Я внес небольшие изменения в пример кода, чтобы включить синхронизацию.

 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_mesgn")
    sreq = MPI.Isend(send_mesg, dst, rank 32, comm)

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

    print("$rank: Received $src -> $rank = $recv_mesgn")

    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 . Может кто-нибудь указать мне правильное направление?

Ответ №1:

Мое первое предложение — взглянуть сюда: https://www.geeksforgeeks.org/benchmarking-in-julia / еще несколько процедур бенчмаркинга. Использование @time , как правило, не является надежным способом тестирования, если вы не пытаетесь получить представление о производительности на очень высоком уровне.

Также похоже, что однострочное форматирование вашего вывода является результатом того, как вы структурируете и впоследствии запускаете код. Попробуйте запустить его без двух процессов или добавить a println() после @time .

В любом случае, то, что вы можете искать, это: https://docs.julialang.org/en/v1/base/base/#Base.@timed это позволяет вам работать и распечатывать определенные части информации о времени, которые могут иметь отношение к вам. Я предлагаю просмотреть документы по этой ссылке выше, поскольку там есть все соответствующие функции.