Вчера вечером после года мучений я нашёл, как...

Вчера вечером после года мучений я нашёл, как убыстрить мой код при экстремальных условиях расчёта примерно в 100 раз. С одной стороны, я нашёл это, и аз есмь хорошо. С другой стороны, осознание того, что для этого потребовалось вставить в трёх местах на 6.2 миллионов символов кода цифру "2", меня вымораживает.

Постановка задачи. Представьте, что вы сидите в ванне и топите жёлтую пластиковую уточку. Этот гештальт нельзя так просто взять и закрыть: бездушная имитация жизни порывается достичь равновесного уровня - то есть поверхности воды. Скорость процесса зависит от содержимого её внутреннего мира (то есть разности плотностей), вязкости воды и прочего. Теперь мы вносим в студию стробоскоп: именно так, отдельными кадрами, мы видим реальность при численном моделировании. И вот, представим, что в один момент у нас есть кадр, где уточка под водой. Мы посчитаем её скорость, а затем попытаемся угадать, где она окажется на следующем кадре. Если следующий снимок будет через 1 минуту, а ваша ванна не на дне океана, то "в теории" наша уточка улетит куда-то далеко-далеко (потому что мы "не знаем", что её скорость станет 0 при достижении поверхности).

Мы можем научиться опознавать поверхность воды и рассчитывать некоторую "эффективную скорость". Если мы снимаем нашу ванну и забавы с утятоньками в ней с частотой, не достаточной, чтобы за один интервал утка всплыла, то её скорость мы оставляем неизменной: пусть проплывёт столько, сколько сможет, я не жадный. А вот если плёнки у нас мало, и кадры редкие, то мы зачеркнём рассчитанную скорость и напишем сильно меньшую - чтобы как раз в момент снятия следующего кадра уточка достигла поверхности и все были счастливы.

Теперь, чтобы представить более реалистичные условия (с учётом некоторых физических эффектов), представим, что в произвольный момент времени в уточке могут разверзнуться врата ада и накормить её внутреннюю пустоту свинцом. После чего она станет тонуть - то есть направление движения поменяется на противоположное (физически процесс обусловлен изменением химического состава (и плотностей) при плавлении/кристаллизации вещества). И это создаёт большую проблему для расчётов: в "боевых" условиях код за сутки на 4 ядрах продвигался на 1 миллион лет притом, что надо просчитать минимум на 100 миллионов лет. Это очень большая проблема. Три месяца ждать нельзя.

Читать продолжение бесплатно, без регистрации и sms у меня в бложике: http://chl-fomin.blogspot.ch/2017/09/speeding-up-computations-and-courant.html
А физика подробнее описана в другом посте: http://chl-fomin.blogspot.ch/2016/11/melt-migration-in-earths-mantle.html

На картинке - это процесс отладки кода для миграции расплавов. Разные численные схемы, разные алгоритмы.
0
У записи 19 лайков,
0 репостов,
427 просмотров.
Эту запись оставил(а) на своей стене Илья Фомин

Понравилось следующим людям