Частичные вызовы MPI_file_read_at_all в Фортране - PullRequest
1 голос
/ 04 мая 2019

Мне нужно прочитать очень большой двоичный файл Фортрана параллельно с MPI.Проблема в том, что файл настолько большой, что каждое ядро ​​не может даже хранить # total_file_size / ncpu в памяти.Поэтому каждый процессор читает последовательно часть файла.

У меня есть следующий псевдокод:

ir_start = start reading position for that cpu
ir_stop = end reading position for that cpu

CALL MPI_FILE_OPEN(world_comm,filint,MPI_MODE_RDONLY,MPI_INFO_NULL,fh,ierr)
size = size of the chuck to read
DO ir=ir_start, ir_stop
  offset = data_size * (ir -1)
  CALL MPI_FILE_READ_AT(fh, offset, data, size, MPI_DOUBLE_PRECISION, MPI_STATUS_IGNORE, ierr)
ENDDO

Это хорошо работает.Однако мне сказали, что MPI_FILE_READ_AT_all (коллективный) будет намного быстрее.

Проблема в том, что если я использую коллективную версию, то она работает только в том случае, если все ядра имеют одинаковое количество элементов (т.е. ir_stop-ir_start одинаково).Это не всегда происходит.Поэтому для некоторого числа ядер код просто зависает, ожидая последнего процессора, который не войдет в последний цикл.

Есть ли умный способ заставить это работать с MPI_FILE_READ_AT_ALL для произвольного числа ядер?

...