Хабы: C++, Fortran
В данной заметке я расскажу о своем опыте распараллеливания программы с использованием OpenMP, написанной одновременно и на С++, и на Fortran 90, причем вызов фортрановской части кода осуществляется параллельно в цикле из C++ части. Остановлюсь в основном на тех деталях и тонкостях, которые мне показались настоящими сюрпризами. Суть программы достаточно проста: есть некая цилиндрическая структура, которая модельно разбивается на аксиальные ячейки, каждая аксиальная ячейка с использованием методов математического моделирования обсчитывается независимо. Основная часть кода написана на C++, но вот то, что нужно рассчитать для каждой аксиальной ячейки, написано на Fortran 90, и надо сказать, что эта фортрановская часть достаточно внушительная. Код испокон веков обсчитывал последовательно каждую аксиальную ячейку, и в виду того, что фортрановская часть делает объемные вычисления, код считал долго. И тут была поставлена задача – распараллелить код, т.е. считать каждую аксиальную ячейку параллельно, дабы ускорить время расчета всей программы. Была принята следующая идея: выделение памяти под массивы и т.п., необходимые для фортрановских расчетов, оставить как и прежде, т.е. там же в фортране, удобно перегруппировав их в массив объектов структуры, описывающей аксиальную ячейку, и плюсом расширив данные, а вот вызов главной функции, делающей вычисления в фортрановской части, делать в цикле по аксиальным ячейкам параллельно в C++ части, т.е. примерно так...
Читать далее