PARALLEL.RU

Дискуссионный клуб по параллельным вычислениям
Текущее время: 13 дек 17 8:26

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
СообщениеДобавлено: 15 окт 14 0:34 
Не в сети

Зарегистрирован: 8 окт 14 6:42
Сообщения: 3
Еще один мой вопрос тут . Я пишу параллельную программу на Fortran с использованием MPI. Программа считает трехмерную гидродинамику.
Разобрался тут с созданием MPI типов и сохранением, работает, но все равно мне кажется не очень гладко. Поэтому, обращаюсь к сообществу за советом.
Спецификация формата выходного файла предполагает следующий вывод значений сеточных функций в каждой точке.
Последовательная программа:
Код:
do i=1,XX
    do j=1,YY
        do k=1,ZZ
            write(ifile) R(i,j,k)
            write(ifile) U(i,j,k)
            write(ifile) V(i,j,k)
            write(ifile) W(i,j,k)
            write(ifile) P(i,j,k)
        end do
    end do
end do

Моя параллельная реализация сохранения(распараллелено только по оси X):
Код:
call MPI_TYPE_CREATE_SUBARRAY(4, [INT(5), INT(ZZ),INT(YY), INT(XX)], [5,ZZ,YY,PDB(iam).Xelements], [0, 0, 0, PDB(iam).Xoffset], MPI_ORDER_FORTRAN, MPI_FLOAT, slice, ierr)
call MPI_TYPE_COMMIT(slice, ierr)   

call MPI_FILE_OPEN(MPI_COMM_WORLD, cFileName, IOR(MPI_MODE_CREATE, MPI_MODE_WRONLY), MPI_INFO_NULL, ifile, ierr)

do i = 1,PDB(iam).Xelements
    do j = 1,YY
        do k = 1,ZZ
            dataTmp(1,k,j,i) = R(i,j,k)
            dataTmp(2,k,j,i) = U(i,j,k)
            dataTmp(3,k,j,i) = V(i,j,k)
            dataTmp(4,k,j,i) = W(i,j,k)
            dataTmp(5,k,j,i) = P(i,j,k)
        end do
    end do
end do

call MPI_FILE_SET_VIEW(ifile, offset, MPI_FLOAT, slice, 'native', MPI_INFO_NULL, ierr)
call MPI_FILE_WRITE_ALL(ifile, dataTmp, 5*PDB(iam).Xelements*YY*ZZ, MPI_FLOAT, wstatus, ierr)
call MPI_BARRIER(MPI_COMM_WORLD, ierr)

ВСЕ РАБОТАЕТ, но не нравится предварительное копирование в 4-мерный массив dataTmp.
Мои идеи:
*Использовать повсеместно в программе 4-мерный массив вроде dataTmp.
*Создать 5 разных типов MPI с заданными смещениями и использовать 5 раз как-нибудь FILE_WRITE_ALL.

Подскажите, какую идею использовать или какой-нибудь более быстрый и корректный способ?


И ЕЩЕ ВОПРОС:
Пишу на PC (Intel Fortran Compiler & Intel MPI) , нужно записывать и читать файл с порядком байт little-endian.
Конечная цель - работа программы на Bluegene (IBM XL Fortran Compiler) (там порядок байт big-endian)
Когда использовался штатный fortran I/O (read/write), для кода, компилируемого на Bluegene я использовал опцию
Код:
call SETRTEOPTS('ufmt_littleendian=8')

и все работало шикарно.
Теперь же, когда я стал использовать MPI I/O , нижеследующий код читает (и пишет) байты наоборот
Код:
call MPI_FILE_SET_VIEW(ifile, offset, MPI_FLOAT, MPI_FLOAT, 'native', MPI_INFO_NULL, ierr)
call MPI_FILE_READ(ifile, header, 16, MPI_FLOAT, wstatus, ierr)

Есть ли какой-нибудь способ (опция, директива и т.д.) для MPI чтобы MPI I/O стал работать с little-endian файлами. Единственное, что приходит на ум - создать свой DATAREP чтобы устанавливать в MPI_FILE_SET_VIEW вместо 'native', но это, вроде как, замедляет работу серьезно. ЧТо посоветуете?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB