#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 это позволяет вам работать и распечатывать определенные части информации о времени, которые могут иметь отношение к вам. Я предлагаю просмотреть документы по этой ссылке выше, поскольку там есть все соответствующие функции.