Я полагаю, что много Фортрана используется в HPC, но не уверен, что это только по старым причинам.
Функции современных языков программирования, такие как сборка мусора или полиморфизм во время выполнения, не подходят для HPC, так как скорость имеет значение, поэтому не уверен, куда приходят C #, Java или C ++.
Есть предположения?
programming-languages
Fanatic23
источник
источник
Ответы:
Я видел много Java, используемого для HPC в областях, где (1) мало унаследованного кода и (2) время разработки и качество кода имеют значение. Типичные области применения - финансы, интеллектуальный анализ данных или биоинформатика.
Это действительно зависит от приложения (существует жизнь за пределами линейной алгебры), но производительность последних JVM часто находится на одном уровне с C-кодом. Иногда быстрее, когда JVM способна выполнять во время выполнения умные оптимизации, которые статические компиляторы (C, Fortran) не могут сделать. И определенно быстрее, когда много символических вычислений.
При фиксированном количестве времени на разработку программы полученный Java-код всегда быстрее, чем C-код. HPC в Java определенно имеет смысл, когда код разрабатывается или изменяется часто. Еще одной важной особенностью является мобильность кода на другом оборудовании.
Вы найдете ссылки в http://ateji.blogspot.com/2010/09/java-for-high-performance-computing.html
Что касается предположения Фортрана, что два адреса являются уникальными, мы работаем над инструментом статического анализа, который позволит проводить аналогичные оптимизации для кода на языках высокого уровня, но без бита «Плохие вещи могут случиться». Свяжитесь со мной, если интересно.
источник
В моем многолетнем опыте, до 5 лет назад, это всегда были Fortran и C. В основном это зависело от того, пришли ли люди больше из инженерии или больше из школы мысли CS (я не знаю, как это лучше сказать) окей? :-)
В том, что мы делали, Фортран использовался почти исключительно.
Из того, что я читал сегодня, с новыми обновлениями к стандарту F2003 / 08 и с появлением Co-массивов, кажется, что он снова набирает обороты.
Кроме того, одна, если не несколько предвзятая статья - Идеальный язык программирования HPC
источник
Я думаю, что для настоящей педали к металлу, единственный реальный выбор - это Fortran. Причина заключается в том, что для эксплуатации низкоуровневого ILP (параличизма на уровне инструкций) наиболее важным является устранение неоднозначности адресов памяти. Правила де-факто в Фортране позволяют компилятору определять, что два адреса являются уникальными (и, следовательно, порядок загрузки и сохранения, или даже хранения и хранения можно менять местами без риска генерирования неправильного кода). C оставляет слишком много возможностей для перекрывающихся указателей для компилятора, чтобы извлечь как можно больше низкоуровневого параллелизма из кода.
Кроме того, выравнивание массивов, строки кэша и границы SSE / AVX важны для генерации и выполнения эффективных циклов. Если массивы передаются через общие блоки, компилятор / загрузчик может гарантировать, что все массивы начинаются с одинаковых границ выравнивания адресов, и можно использовать более эффективные загрузки и сохранения SSE / AVX. Более новое оборудование может обрабатывать невыровненные обращения к памяти, но поскольку доступ к памяти не выровнен должным образом, частичное использование строк кэша приводит к снижению производительности. Даже если программист C правильно выровняет все свои массивы, существует ли механизм для передачи этого компилятору?
Подводя итог, можно сказать, что двумя наиболее важными вопросами являются независимость адресов памяти и признание компилятором того, что структуры данных, к которым осуществляется доступ, имеют такое же «естественное» выравнивание, которое требуется аппаратному обеспечению. Пока что Фортран лучше всех справляется с этими двумя задачами.
источник
Просто какая-то анекдотическая заметка. Я сам не делал высокопроизводительных вычислений.
Для вычислений (подсчет чисел), Fortran и C. Да, это по старым причинам:
Современная тенденция к сокращению чисел заключается в написании программных генераторов, которые автоматизируют настройку исходного кода для оптимизации производительности с учетом характеристик кластера. Эти генераторы часто выводятся в C.
Вторая тенденция - написать на каком-то специализированном диалекте C для конкретных графических процессоров или Cell BE.
Для нечисловой работы, такой как программы, которые обрабатывают данные из базы данных (но не самой базы данных), гораздо дешевле работать на кластерах «обычных» машин без дорогостоящего специализированного сетевого оборудования. Обычно это называется «высокопроизводительные вычисления». И Python является языком № 1 здесь (используя знаменитую Map Reduce). До Python проекты пакетной обработки могли быть написаны на любом языке и обычно отправлялись Condor .
источник
Я работал над ОЧЕНЬ интенсивным кодом на C #.
Я строю реализацию FDTD для оптического моделирования в GPGPU . На небольшом кластере (128 процессоров) многим нашим симуляциям требуются недели. Реализации GPU, однако, имеют тенденцию работать примерно в 50 раз быстрее - и это на плате NVidia потребительского уровня. Теперь у нас есть сервер с двумя двухпроцессорными картами GTX295 (несколько сотен ядер), и мы скоро получим немного Teslas.
Какое это имеет отношение к вашему языку? Так же, как код FDTD C ++, который мы использовали ранее, был привязан к процессору, он привязан к графическому процессору, поэтому ( очень небольшая) разница в лошадиных силах управляемого и нативного кода никогда не вступает в игру. Приложение C # действует как проводник - загружая ядра OpenCL, передавая данные в и из графических процессоров, обеспечивая пользовательский интерфейс, отчеты и т. Д. - все задачи, которые являются проблемой в C ++.
В прошлые годы разница в производительности между управляемым и неуправляемым кодом была настолько значительной, что иногда стоило мириться с ужасной объектной моделью C ++, чтобы получить дополнительные несколько процентов скорости. В наши дни стоимость разработки C ++ против C # намного превышает преимущества большинства приложений.
Кроме того, большая часть различий в производительности будет зависеть не от выбора языка, а от мастерства вашего разработчика. Несколько недель назад я переместил одну операцию деления изнутри цикла с тройным вложением (обход трехмерного массива), что сократило время выполнения для данной вычислительной области на 15%. Это результат архитектуры процессора: медленное деление, которое является одним из тех лиц, которые вам просто нужно где-то заметить.
источник
Фортран является наиболее распространенным, прежде всего из-за унаследованного (люди все еще используют старый код) и фамильярности (большинство людей, которые используют HPC, не знакомы с другими типами языков).
Это не так в целом. Классическая HPC в основном делала линейную алгебру с числами машинной точности. Однако современные HPC все чаще используют суперкомпьютеры для более широкого спектра задач, таких как символьные вычисления с произвольными математическими выражениями вместо чисел точности машин. Это накладывает совершенно разные характеристики на инструменты, которые вы используете, и нередко использовать языки программирования, отличные от Fortran, потому что символические вычисления могут быть непомерно трудными без GC и других видов оптимизирующего компилятора, таких как OCaml, оптимизирующий компилятор сопоставления с образцом.
Например, прочитайте эту статью Fischbacher et al. в котором говорится, что «у авторов есть веские основания полагать, что это, возможно, самый большой символический расчет, выполненный до сих пор».
источник
Фортран, по некоторым хорошим и не очень хорошим причинам. Для сложного математического анализа хорошая причина в том, что существуют обширные библиотеки (BLAS, LAPACK) проверенных и проверенных подпрограмм, все они написаны на Fortran (хотя их можно вызывать из C и C ++).
Не очень хорошая причина - предполагаемое преимущество производительности Fortran над C / C ++. Оптимизаторы очень хороши, и мало кто понимает, что выгода от оптимизации фрагмента кода пропорциональна проценту времени, которое он занят, что почти во всем коде практически равно нулю.
Другая не очень хорошая причина - культурный разрыв между программистами CS и не CS. Научных программистов, как правило, учат вредным привычкам на Фортране, и они смотрят свысока на программистов CS и на вредные привычки, которым их учили, и которые смотрят свысока на первое.
источник
По сути, все программы, которые выполняют фактическую обработку чисел, по-прежнему являются Фортраном (старые бла, лапак, арнольди и т. Д. Все еще используются) ... Однако, когда речь идет о структуре более высокого уровня ... люди все чаще используют C ++.
Сложность симуляции заключается в огромном коде, и получить какую-либо выгоду от написания такого кода - сделать его многоразовым. Кроме того, используемые концепции также стали очень сложными. Представлять эту информацию с помощью Фортрана - это почти безумие. Вот тут и появился C ++, поскольку он изначально поддерживает объектно-ориентированный дизайн. Тем не менее, полиморфизм во время выполнения редко является предпочтительным. Вместо этого люди почти всегда используют статический полиморфизм (который реализован в C ++ с шаблонным метапрограммированием)
Кроме того, теперь компиляторы действительно хороши, поэтому большая часть оптимизации остается за компиляторами.
источник
Существует два вида проблем, которые необходимо решать в приложениях HPC: одна - это само вычисление числа, а другая - управление вычислениями. К первому обычно подходит код, написанный на Fortran, C или C ++, из-за скорости и из-за того, что на этих языках уже написано много научных алгоритмов. Управление вычислениями более удобно реализовано на языках более высокого уровня. Python является предпочтительным языком для обработки логики приложения и вызова расширений, реализованных на скомпилированных языках. Java часто используется проектами, в которых управление сетью и распределенными вычислениями имеет важное значение.
источник