#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 )