В чем разница между кодом, написанным для настольного компьютера и суперкомпьютера? - PullRequest
4 голосов
/ 14 августа 2011

Гипотетически говоря, если бы моя научная работа была направлена ​​на разработку функций / модулей / подпрограмм (на рабочем столе), что мне нужно было бы знать, чтобы включить это в крупномасштабное моделирование для запуска на суперкомпьютере (который может имитировать молекулы, жидкости, реакции и т. д.)?

У меня сложилось впечатление, что это связано с использованием, по возможности, определенных библиотек (например, BLAS, LAPLACK), пересмотром алгоритмов (сокращение итераций), профилированием, распараллеливанием, с учетом использования / доступа к процессору на жестком диске. Мне известна пословица «хочешь оптимизировать свой код? Не делай этого», но если кто-то заинтересовался изучением написания эффективного кода, какие ссылки могли бы быть доступны?

Я думаю, что этот вопрос не зависит от языка, но, поскольку многие вычислительные пакеты для биомолекулярного моделирования, моделирования климата и т. Д. Написаны в некоторой версии Фортрана, этот язык, вероятно, был бы моей целью интереса (и я запрограммировал довольно в Фортране 77).

Ответы [ 4 ]

5 голосов
/ 14 августа 2011

Профилирование является обязательным на любом уровне техники. При общепринятом использовании я обнаружил, что масштабирование до все более и более крупных сеток требует лучшего понимания программного обеспечения и топологии сетки. В этом смысле все, что вы узнаете об оптимизации для одной машины, все еще применимо, но понимание программного обеспечения грид дает вам дополнительный пробег. Hadoop является одной из самых популярных и широко распространенных грид-систем, поэтому изучение параметров планировщика, интерфейсов (API и веб-интерфейсов) и других аспектов использования поможет. Хотя вы не можете использовать Hadoop для данного суперкомпьютера, это один из менее болезненных методов изучения распределенных вычислений. Для параллельных вычислений вы можете использовать MPI и другие системы.

Кроме того, изучение параллелизации кода на одном компьютере, на нескольких ядрах или процессорах - это то, что вы можете начать изучать на настольном компьютере.

Рекомендации:

  1. Узнайте, как оптимизировать код на одной машине:
    • Обучение профилированию
    • Научитесь использовать оптимизированные библиотеки (после профилирования, чтобы увидеть ускорение)
    • Убедитесь, что вы хорошо знаете алгоритмы и структуры данных (*)
  2. Научитесь выполнять смущающее параллельное программирование на нескольких основных машинах.
    • Позже: рассмотрим многопоточное программирование. Это сложнее и может не окупиться за вашу проблему.
  3. Узнайте о базовом сетевом программном обеспечении для распределенной обработки
  4. Узнайте об инструментах для параллельной обработки на сетке
  5. Научитесь программировать на альтернативное оборудование, например, Графические процессоры, различные специализированные вычислительные системы.

Это не зависит от языка. Мне пришлось выучить одну и ту же последовательность на нескольких языках и нескольких системах HPC. На каждом шаге выбирайте более простой маршрут, чтобы изучить некоторые инфраструктуры и инструменты; например изучите многоядерный перед многопоточным, распределенным перед параллельным, чтобы вы могли видеть, что подходит для оборудования и проблемы, а что нет.

Некоторые шаги могут быть переупорядочены в зависимости от локальной вычислительной практики, установленных кодовых баз и наставников. Если у вас есть большая библиотека GPU или MPI, то вы должны научиться этому, а не навязывать Hadoop своим сотрудникам.

(*) Причина, по которой алгоритмы очень хорошо знакомы, заключается в том, что как только ваш код будет запущен в сетке, его увидят другие. Когда система перегружена, они захотят узнать, что вы делаете. Если вы выполняете процесс, который является полиномиальным и должен быть постоянным, вы можете оказаться насмешливым. Другие, обладающие большим опытом в предметной области, могут помочь вам найти хорошие приближения для сложных задач, но вы должны знать, что концепция существует.

5 голосов
/ 14 августа 2011

Гипотетически говоря, если бы моя научная работа была направлена ​​на разработку функций / модулей / подпрограмм (на рабочем столе), что мне нужно знать, чтобы включить ее в крупномасштабное моделирование, чтобыработать на суперкомпьютере (который может имитировать молекулы, жидкости, реакции и т. д.)?

Во-первых, вам необходимо понять проблему.Не все проблемы могут быть решены параллельно (и я использую термин параллельный в таком широком значении, какое только возможно).Итак, посмотрите, как теперь решается проблема.Может ли это быть решено другим способом быстрее?Можно ли его разделить на независимые части ... и так далее ...

Фортран - это язык, специализирующийся на научных вычислениях, и в последние годы наряду с развитием новых языковых возможностей такженекоторые очень интересные разработки с точки зрения возможностей, которые нацелены на этот «рынок».Термин «совместные массивы» может быть интересным для чтения.

Но сейчас я бы предложил сначала прочитать книгу типа Использование OpenMP - OpenMP - более простая модель, но книга (примеры изнутри) хорошо объясняет основы.Интерфейс парсинга сообщений (для друзей MPI :) - более крупная модель, одна из часто используемых.Ваш следующий шаг от OpenMP, вероятно, должен идти в этом направлении.Книги по программированию MPI не редкость.

Вы упомянули также библиотеки - да, некоторые из упомянутых вами широко используются.Другие также доступны.Человек, который не знает точно, в чем проблема производительности, должен ИМХО никогда не пытаться выполнить задачу переписывания библиотечных подпрограмм.

Также есть книги по параллельным алгоритмам, которые вы, возможно, захотите проверить.

Я думаю, что этот вопрос не зависит от языка, но, поскольку многие вычислительные пакеты для биомолекулярного моделирования, моделирования климата и т. Д. Написаны в какой-то версии Fortran, этот язык, вероятно, будет моей целью интереса (и яЯ довольно много программировал на Фортране 77).

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

5 голосов
/ 14 августа 2011

Параллелизация была бы ключевой.

Поскольку указанные вами проблемы (например, CFD, мультифизика, массоперенос) обычно выражаются в виде масштабных задач линейной алгебры, вам нужны матричные процедуры, которые хорошо распараллеливаются.MPI является стандартом для подобных задач.

Физика также может влиять.Например, можно эффективно решить некоторые эллиптические задачи, используя явную динамику и искусственные матрицы массы и демпфирования.

Мультифизика 3D означает связанные дифференциальные уравнения с изменяющимися временными масштабами.Вам понадобится мелкая сетка для разрешения деталей как в пространстве, так и во времени, поэтому число степеней свободы будет быстро расти;временные шаги будут зависеть от требований стабильности вашей проблемы.

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

3 голосов
/ 14 августа 2011

Мы находимся в позиции, аналогичной вашей. Я полностью согласен с ответом @ Iterator, но я думаю, что есть еще что сказать.

Прежде всего, я верю в «профилирование» методом случайной паузы , потому что я не очень заинтересован в измерении вещей (это достаточно просто сделать), но в точном определении кода, который в результате чего трата времени, поэтому я могу это исправить. Это как разница между прожектором и лазером.

Для одного примера мы используем LAPACK и BLAS. Теперь, когда я брал свои стековые сэмплы, я увидел, что многие сэмплы были в программе, которая сравнивает символы. Это было вызвано из общей процедуры, которая умножает и масштабирует матрицы, и это было вызвано из нашего кода. Процедура манипулирования матрицей для того, чтобы быть гибкой, имеет символьные аргументы, которые говорят ей о вещах, например, является ли матрица нижней треугольной или что-то в этом роде. На самом деле, если матрицы не очень большие, процедура может потратить более 50% своего времени, просто классифицируя задачу . Конечно, в следующий раз, когда он вызывается из того же места, он делает то же самое снова и снова. В таком случае должна быть написана специальная процедура. Когда он оптимизирован компилятором, он будет настолько быстрым, насколько это разумно, и сэкономит все это время классификации.

В другом примере мы используем различные решатели ODE. Они оптимизированы до n-й степени, конечно. Они работают, вызывая пользовательские процедуры для вычисления производных и, возможно, матрицы Якоби. Если эти пользовательские подпрограммы на самом деле мало что делают, примеры действительно покажут счетчик программы в самом решателе ODE. Однако, если пользовательские подпрограммы делают намного больше, образцы будут находить нижний предел стека в этих подпрограммах в основном потому, что они занимают больше времени, а код ODE - примерно столько же времени. Таким образом, оптимизация должна быть сосредоточена на пользовательских подпрограммах, а не на коде ODE.

После того, как вы выполнили несколько видов оптимизации, которая определяется с помощью выборки из стека, которая может ускорить процесс на 1-2 порядка , тогда все средства используют параллелизм, MPI и т. Д. ... если проблема позволяет это.

...