Python: comm.Scatterv () в mpi4py, почему значение изменяется после рассеяния - PullRequest
0 голосов
/ 19 ноября 2018

Я хочу разбросать разные длины np.array в разные ранги, но я считаю, что значение изменилось, и я не знаю, почему. Я пытался много раз и упростил свой код, как показано ниже.

import numpy as np
import random
from random import seed
from mpi4py import MPI
comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()

num = 4
N = num // size + (num % size > rank)

position_x = np.zeros(num,dtype=float)

seed(10059)
for i in range(num):

    position_x[i] = round(random.uniform(-5,5),3)


print(position_x)

if rank == 0:
    share1 = position_x

else:
    share1  = None


count = []
for i in range(size):
    if i <= num%size-1:
        count += [num//size + 1]
    else:
        count += [num//size]

pos1 = np.zeros(N, dtype='f')

comm.Scatterv([share1, count, MPI.FLOAT], pos1, root=0)

print(pos1,'from ',rank)

Результат 3 процессов показан ниже.

[-2.275  4.238 -1.637  0.981]
[5177.344] from 1
[-2.275  4.238 -1.637  0.981]
[ 4.172325e-08 -2.034375e+00] from 0
[-2.275  4.238 -1.637  0.981]
[2.264875] from 2

Я не могу понять, откуда появляются странные цифры. Результат должен быть [-2.275 4.238] from 0, [-1.637] from 1, [0.981] from 2, если верно. У кого-нибудь есть идея? Большое спасибо.

--------------------------------------------

Обновление:

Я нахожу, если числа в np.array являются числами с плавающей запятой, у него возникнет эта проблема. Я пытаюсь изменить тип данных на MPI.INT или MPI.F_FLOAT, но он все равно не работает.

Кажется, это вызвано random, но мне нужно случайным образом сгенерировать позицию. Я действительно не знаю, как это исправить.

...