MPI_FILE_READ && littleianian на Bluegene
Мне нужно прочитать (и написать) некоторый двоичный файл с прямым порядком байтов. Я пишу свой код Fortran на ПК с использованием Intel FC и Intel MPI. Ввод-вывод на ПК работает нормально, но последняя причина - запуск программы на Bluegene/P. Bluegene/P(XL Fortran Compiler) имеет большой порядок байтов. И когда мне нужны непараллельные операции ввода / вывода (например, Fortran REED & WRITE), я использую
call SETRTEOPTS('ufmt_littleendian=8')
К сожалению, когда мне нужен параллельный ввод / вывод, например MPI_FILE_READ, "SETRTEOPTS('ufmt_littleendian=8')" игнорируется. Я устанавливаю вид с:
call MPI_FILE_SET_VIEW(ifile, offset, MPI_FLOAT, MPI_FLOAT, 'native', MPI_INFO_NULL, ierr)
Что я должен делать? Я не хочу создавать свой собственный DATAREP. Есть ли другой путь? Скорость очень важна.
2 ответа
Вам нужно использовать параллельный-netcdf или HDF5. Кривая обучения для Parallel-HDF5 немного крутая, но вы получите самоописываемый переносимый формат файла. Это поможет вам в будущем способами, которые вы еще не понимаете.
Снижение производительности незначительно. Pnetcdf имеет преимущество, если у вас много маленьких наборов данных, но это довольно патологическая ситуация.
некоторые приложения выполняют байтовую выгрузку, но, как вы упомянули на языке Fortran, вам нужно быть очень осторожным, чтобы компилятор Fortran для ПК и компилятор Blue Gene Fortran точно договорились о том, сколько (если таковые имеются) отступов для записи добавить в свой вывод Fortran. Bleah.
Вы можете попробовать добавить "call setrteopts('ufmt_littleendian=8')" в вашу программу вместо установки переменной окружения.
Кроме того, вы можете указать компилятору Intel генерировать файлы данных с прямым порядком байтов. См. Спецификатор CONVERT= в операторе OPEN или параметр компилятора convert.
Преобразование (либо из последовательности с прямым порядком байтов в последовательность с прямым порядком байтов на стороне BG/P, либо из последовательности с прямым порядком байтов в последовательность с прямым порядком байтов на стороне Intel) приводит к снижению производительности во время выполнения. Поэтому, если вы хотите, чтобы сторона чтения (BG/P) была максимально быстрой, лучше всего создавать файлы данных с прямым порядком байтов на стороне записи (Intel).