Какая производительность лучше для отправки одного целого числа «i» с mpi4py: comm.send (i) или comm.Send (np.array ([i])) и почему? - PullRequest
0 голосов
/ 12 января 2020

Поскольку отправляемые данные настолько просты, я не уверен, какой метод имеет лучшую производительность, скажем, если мне нужно отправить одно целое число много раз. Некоторые предварительные моменты времени указывают, что строчные методы работают быстрее, но я ожидал бы, что строчные методы будут быстрее, поэтому я хотел бы понять, почему. Вот небольшой пример отправки отрицательного целого числа между двумя процессами.

#!/usr/bin/env python3

from mpi4py import MPI
import numpy as np
import time

# Inputs
npings = 1000
numpy_send = False

# Message details
pvalue = -9
ptype_np = np.int_
ptype_mpi = MPI.LONG
if numpy_send:
    ping = [np.array([pvalue], dtype=ptype_np), 1, ptype_mpi]
else:
    ping = pvalue

# Initialize
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
total=0

# Perform communication and time it
if rank == 0:
    for i in range(npings):
        if numpy_send:
            ping = np.empty(1,dtype=ptype_np)
            t1 = time.time()
            comm.Recv(ping, source=1)
            t2 = time.time()
        else:
            t1 = time.time()
            ping = comm.recv(source=1)
            t2 = time.time()
        total += t2-t1
else:
    for i in range(npings):
        if numpy_send:
            t1 = time.time()
            comm.Send(ping, dest=0)
            t2 = time.time()
        else:
            t1 = time.time()
            comm.send(ping, dest=0)
            t2 = time.time()
        total += t2-t1

# Display results
if rank == 0:
    total_send = 0
    total_send = comm.recv(source=1)
    if numpy_send:
        print("USING NUMPY ARRAYS:")
    else:
        print("USING PYTHON OBJECTS:")
    print("{:5.5e}s total receiving time".format(total))
    print("{:5.5e}s total sending time".format(total_send))
    print("{:5.5e}s total time".format(total+total_send))
else:
    comm.send(total, dest=0)

...