Правильно спроектировать параллельный, критичный к производительности числовой код

Я инженер-механик по образованию, и работаю в исследовательской среде, в основном расширяя существующую базу числовых кодов от 25 лет и старше. Недавно я решил, что хотел бы научиться создавать серьезную научную программу с нуля.

Я разговаривал со многими учеными на факультете CS в университете, и, как мне кажется, принято считать, что люди, которые, скорее всего, будут создавать крупномасштабные численные приложения, работают на механических / химических / биологических факультетах. Точно так же большинство людей, пишущих эти приложения, мало или совсем не знакомы с принципами проектирования программного обеспечения.

Как и большинство инженеров, я учусь на практике, поэтому я собираюсь поставить перед собой задачу выполнить следующее: Разработайте адаптивную схему сетки, которая локально уточняет / огрубляет на основе расположения произвольно движущейся кривой. Через эту решетку решите уравнение теплопроводности (или какой-нибудь другой PDE).

Вещи, которые я хотел бы включить:

  1. Параллельно (у меня есть небольшой опыт работы с MPI, так что, вероятно, придерживайтесь этого) — возможно, объединить в OpenCL (нет карт Nvidia, поэтому нет CUDA)
  2. Сочетание Python и C ++ (управляемый сценариями пользовательский интерфейс в Python, исполнение в C ++)
  3. Объектно-ориентированный дизайн на основе шаблонов (одна часть, которую я действительно хочу изучить)
  4. Фреймворк для юнит-тестирования (я использовал gtest и, вероятно, буду придерживаться этого, но не уверен, насколько детализирован процесс проведения юнит-тестов, я прочитал различные советы для юнит-тестирования научного кода)
  5. На основе Linux — на данном этапе не слишком заботятся о переносимости
  6. Возможно использование библиотек Boost
  7. Используйте HDF5 или VTK для сохранения результатов (я знаю VTK, но чувствую, что HDF5 лучше подходит)
  8. Профилированная производительность

На некоторые вопросы я пытаюсь ответить:

  1. Это похоже на гигантскую задачу, это нормально, но каков общий процесс ее разрушения? Вы начинаете с базовой инфраструктуры (обертки MPI, классы матриц и т. Д.), Или вы начинаете с взаимодействия на высоком уровне (основной контроллер, пользовательский интерфейс и т. Д.), Или где-то совершенно другое?
  2. Соответствует ли парадигма Python + C ++ запуску MPI в кластере?
  3. Я не нашел ни одной книги, которая бы касалась дизайна приложений в научном контексте — потому что он не существует или я не смотрю в нужном месте?
  4. Я хорошо знаю, как можно оптимизировать процесс «запусти его, а затем профилировать», но я предполагаю, что некоторые из базовых проектных решений, принятых на старте, будут влиять на производительность. Какие основные недостатки следует учитывать при разработке цифрового кода высокого уровня?

NB: я не уверен, подходит ли этот вопрос к формату stackexchange — если нет, я с радостью перефразирую …

4

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]