Как распределить/отправить все возможные пары столбцов дочерним процессам и найти согласованность между столбцами с помощью python mpi4py? Параллельные вычисления

#python-3.x #mpi4py #numpy-slicing

Вопрос:

У меня есть большой матричный/2D массив, для которого мне нужна каждая возможная пара столбцов, чтобы найти согласованность путем параллельных вычислений в python (например, mpi4py). Согласованность [функция] вычисляется в различных дочерних процессах, и дочерний процесс должен отправить значение согласованности родительскому процессу, который собирает значение согласованности в виде списка. Для этого я создал небольшую матрицу и список всех возможных пар столбцов следующим образом:

 import numpy as np from scipy import signal from itertools import combinations from mpi4py import MPI   comm = MPI.COMM_WORLD nproc = comm.Get_size() rank = comm.Get_rank()  data=np.arange(20).reshape(5, 4) #List of all possible column pairs data_col = list(combinations(np.transpose(data), 2)) #list  # Function creation def myFunc(X,Y): .................. ..................  return Real_coh  if rank==0:  Data= comm.scatter(data_col,root=0) #col_pair  

Может ли кто-нибудь подсказать мне, как действовать дальше. Вы можете задать любые вопросы/разъяснения. Ожидаю вашей сердечной помощи. Спасибо

Ответ №1:

проверьте следующие сценарии [с комм.Барьер для синхронизации. связь]. В сценарии я написал и прочитал файлы в виде фрагмента набора данных h5py, который эффективно использует память.

 import numpy as np from scipy import signal from mpi4py import MPI import h5py as t  chunk_len = 5000 # No. of rows of a matrix num_c = 34 # No. of column of the matrix  # Actual Dataset data_mat = np.random.random((10000, num_c))  shape = (chunk_len, data_mat.shape[1]) chunk_size = (chunk_len, 1) no_of_chunks = data_mat.shape[1]  with t.File('file_name.h5', 'w') as hf:  hf.create_dataset("chunked_arr", data=data_mat, chunks=chunk_size, compression='lzf') del data_mat  def myFunc(dset_X, dset_Y):  ..............  ............  return Real_coh  res = np.zeros((num_c, num_c))  comm = MPI.COMM_WORLD size = comm.Get_size() rank = comm.Get_rank()  for i in range(num_c):  with t.File('file_name.h5', 'r', libver='latest') as hf:  dset_X = hf['chunked_arr'][:, i] # Chunk data reading  if i % size == rank:  for j in range(num_c):  with t.File('file_name.h5', 'r', libver='latest') as hf:  dset_Y = hf['chunked_arr'][:, j] # Chunk data reading  res[i][j] = spac(dset_X, dset_Y) comm.Barrier() print('Shape of final result :', res.shape )