Лучший способ читать / транслировать параллельные данные на все процессоры в формате hdf5 - PullRequest
2 голосов
/ 26 марта 2019

У меня есть параллельное приложение на 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?

...