У меня есть параллельное приложение на Fortran, и я хотел бы читать в средних и больших массивах данных, которые будут «зеркально отражены» на всех процессорах.Другими словами, это «глобальные» данные, такие как местоположения наблюдений, которые необходимы для работы всех элементов обработки, а не распределенные массивы, которые будут распределены по процессорам.
Существует ли чистое HDF-решение, которое будет эффективно считывать все данные и транслировать их на элементы обработки?
Из параллельной документации HDF я понимаю, что могу параллельно выбирать гиперслабиспользуя следующее:
! open the file, etc.
! ...
call h5sselect_hyperslab_f (slabspace, H5S_SELECT_SET_F, &
& data_offset, data_count, hdf_error)
call h5pcreate_f(H5P_DATASET_XFER_F, plist_id, hdf_error)
call h5pset_dxpl_mpio_f(plist_id, H5FD_MPIO_COLLECTIVE_F, &
& hdf_error)
call h5dread_f(dset_tb, H5T_IEEE_F32LE, obs, dims, &
& hdf_error, file_space_id = slabspace, mem_space_id = memspace, &
& xfer_prp = plist_id)
Насколько я понимаю, это можно использовать для установки data_offset и data_count через гиперслаб, который может распределять данные по различным процессорам.
Однако мне было интересно,Я что-то упустил для моего случая, когда все процессоры получат все данные.Если я сделаю data_offset равным 0 для h5sselect_hyperslab_f и запустлю все данные, правильно ли я ожидаю, что производительность будет ужасной?
Или мне нужно самому разбивать ввод / вывод на процессорахс гиперслабом, затем использовать MPI allgather?