LINUX.ORG.RU

Fortran 2018: новый стандарт языка

 , ,


3

4

2-го декабря 2018-го года Международная Организация по Стандартизации (ISO) опубликовала ISO/IEC 1539:2018, ранее известный под названием Fortran 2015.

Новый стандарт расширяет возможности взаимодействия с программами на C и параллельного программирования:

  • Введён новый тип CFI_cdesc_t, содержащий информацию о типе элементов, ранге, размере передаваемого массива и способе выделения его памяти. Ранее на сторону программы, написанной на языке C, вместо массивов чисел можно было передать только «голые» указатели, и о соблюдении границ массивов приходилось заботиться вручную.
  • Введено понятие команды (team), позволяющее разделить выполняющуюся на кластере программу на несколько сравнительно независимых подмножеств процессов.
  • Появилась возможность обработки ошибок отдельных процессов кластера (fail image и аргумент stat= вызовов change team, end team, event post, form team, sync all, sync images, sync team).
  • Добавлены атомарные операции над переменными (atomic_add, atomic_and, atomic_or, atomic_xor, atomic_fetch_add, atomic_fetch_and, atomic_fetch_or, atomic_fetch_xor, atomic_cas).
  • Улучшена совместимость со стандартом ISO/IEC/IEEE 60559:2011 для чисел с плавающей запятой.

Следующая версия стандарта временно называется Fortran 202x.

Новые возможности Fortran 2018

Бесплатно доступный черновик стандарта

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Ответ на: комментарий от jamy

Я писал на Окамле. Неудобно по факту. Все алгоритмы в основном расчитаны на интенсивные матрично-векторные операции, а в ML с этим не всё гладко и не так удобно, как в Фортране, Питоне или Матлабе.

Vudod ★★★★★ ()
Ответ на: комментарий от Vudod

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

Я писал на Окамле. Неудобно по факту.

Это потому что вы не тот диалект использовали. Зачем же Ocaml, он же Object, т.е. общего назначения. Я же говорил о чистом SML. Например для проверки гипотез нужно было использовать Alice, в нем есть удобный инспектор

Все алгоритмы в основном расчитаны на интенсивные матрично-векторные операции, а в ML с этим не всё гладко и не так удобно, как в Фортране, Питоне или Матлабе

Что за бред? Списки и кортежи никто не отменял

jamy ()
Ответ на: комментарий от anonymous

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

Ещё раз упомяну форматированное чтение и экстремально быстрый I/O c ASCII.

skvitek ()
Ответ на: комментарий от jamy

Не знаю, я хоть и учился на фортране азам, но желания его использовать что-то нет, точно также и с паскалем.

Вот точно также у фотранщиков, сишников и плюсовиков нет желания использовать SML. Представь себе, что они такие же люди как и ты!

Ваще, в ойти фактор «нравится/не-нравится» один из самых главных после двух других:

(1) «а кто заплатит за то, чтобы переписать легаси и потом отловить все ошибки? и кто заплатит за все факапы, случившиеся в результате оного переписывания, если не уволят»;

(2) «а на фига ядро операционной системы писать на Java, C# или JavaScript»?

dave ★★★★★ ()
Ответ на: комментарий от dave

Вот точно также у фотранщиков, сишников и плюсовиков нет желания использовать SML. Представь себе, что они такие же люди как и ты!

Не все так. Часто выбор платформы либо уже сделан, либо положен на человека который когда-то был программистом, потом перешел в проджект менеджмент. И мыслит: «так, C/Java/[подставить нужное] я учил в универе, так что если что смогу понять что они там накодили...»

«а кто заплатит за то, чтобы переписать легаси и потом отловить все ошибки? и кто заплатит за все факапы, случившиеся в результате оного переписывания, если не уволят»;

В кчестве свободного ПО, хочешь пользуй, хочешь нет

«а на фига ядро операционной системы писать на Java, C# или JavaScript»?

Не понял этот вопрос. Это к чему?

jamy ()
Ответ на: комментарий от ZERG

Где почитать не знаю.

Но можно попробовать сгенерировать ASCII-файл на несколько гигабайт с переменной шириной строки и считывать оттуда значения парами/тройками/иликакнадо. В Фортране для этого нужно только задать формат - и программа будет читать пары/тройки/чтотамувас даже если между значениями будет перенос каретки. Мой опыт показал, что безопаснее для нервов тут Фортран.

Про скорость I/O то же самое: читать/писать несколько гигабайт ASCII и засекать время. Я обрабатываю подобные данные часто и периодически наблюдаю, как люди пробуют начать делать это на C/C++ по разными причинам... Опять же, когда важно делать это быстро - только Фортран.

skvitek ()
Ответ на: комментарий от grem

То есть по этому пункту возражений нет. Понятно. В новом гомностандарте гомноязычка, стало быть осталось всё по старому. Спасибо за информацию.

anonymous ()
Ответ на: комментарий от skvitek

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

anonymous ()
Ответ на: комментарий от grem

На фейхуа вычислять фундаментальную константу вообще ? Хоть каждый раз, хоть один раз ? У вас там что, значение пи может меняться от запуска к запуску штоли ? В нормальных ЯП константы вообще не являются сущностями типа переменных (кстати, в примере pi - таки не константа вовсе, а переменная, соответственно может быть изменена - бугогага!!!). Коммон блоки - это чтоли та лажа, которую каждый раз надо объявлять в начале функции, при этом не забыть следование и типы данных, иначе integer наедет на double и будет очень увлекательный квест по поиску где глючит ? А и ещё если что-то поменял в коммон блоке, то соотв. изменения на до в точности внести во всех местах, где этот коммон блок используются - ты про это штоли говнищще ? Да про точность тоже хорошо ты напомнил, - если не указал - то будет наихудшая по умолчанию, и соответственно придётся искать, где там что теряется. Увлекательно, чо.

anonymous ()
Ответ на: комментарий от anonymous

Мне нечего возразить человеку, который пытается сломать гидравлический орган и при этом жалуется. Иди уже отсюда, «непризнанный гений».

grem ★★★★★ ()
Ответ на: комментарий от skvitek

Это вообще не проблема. Скорость ввод-вывода в нормально спроектированном приложении ограничена пропускной способностью ФС, дисковой и/или сетевой подсистем. И да, сохранять в ASCII многогигабайтные файлы - это ебанько, ещё раз подтверждающее стремление фортранщиков выдумать проблему, а потом героически её решать.

anonymous ()
Ответ на: комментарий от grem

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

anonymous ()
Ответ на: комментарий от anonymous

И да, сохранять в ASCII многогигабайтные файлы

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

skvitek ()
Ответ на: комментарий от anonymous

А плавучку с произвольной точностью ?

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

skvitek ()
Ответ на: комментарий от grem

И в догон. Дружище, не обижайся, но ещё больше я был бы рад, если бы ты что-то аргументированно возразил, и/или продемонстрировал образец реально достойного кода на фортране. Я этого долгие годы пытаюсь добиться этого от апологетов, и да, был бы очень рад поменять свою позицию по отношению к сабжу. Но так как в ответ получаю «иди отсюда», то делаю вывод, что ситуация безнадёжна.

anonymous ()
Ответ на: комментарий от anonymous

в примере pi - таки не константа вовсе

Как объявил, такая и «константа». Нечего на зеркало пенять.

Коммон блоки

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

Увлекательно

Да и этот язык любят не только за это.

grem ★★★★★ ()
Ответ на: комментарий от anonymous

Меня устраивает код библиотеки stringifor, если из новенького.

реально достойного кода на фортране.

Названия библиотек на фортране77 давать не буду, а то тебя порвёт из-за отсутствия понимания почему оно должно выглядеть так.

Оно работает, им пользуются и оно является референсом. Куда уж достойнее?

был бы очень рад поменять свою позицию по отношению к сабжу

Ржунимогу.

grem ★★★★★ ()
Ответ на: комментарий от skvitek

Хотелось бы узнать как сделать I/O на C быстрым.

А что не так с I/O на си? Есть read/write, который простая обёртка над linux api, есть более высокоуровневые FILE*. А в фортране как-то иначе, в обход файловых операций ОС?

aureliano15 ()
Ответ на: комментарий от skvitek

Это очень медленно, особенно когда нужно брать и перемещать блоки информации туда-сюда.

А более конкретно? В идеале: вот код на Fortran, работает столько-то. А вот код на C, работает вот столько-то.

eao197 ★★★★★ ()
Ответ на: комментарий от aureliano15

Откуда я знаю? Я научный сотрудник, а не программист, я использую то, что проще и быстрее.

Кстати, даже на stackoverflow открыто достаточно тредов по поводу Fortran vs C/C++ I/O и способов достижения в последних скорости первого, но, повторюсь, мне в первую очередь дороже мои нервы.

skvitek ()

Это очень печально, что физики-химики-биологи с высшим образованием и PhD программируют хуже веб-люмпенов вообще без образования.

Впрочем, им за такую работу и платят соответственно, так что всё честно.

anonymous ()
Ответ на: комментарий от anonymous

Помимо read/write остаются наверно только mmap и sendfile, или буферизацию в памяти смотреть

С буферизацией С/С++ программы работают действительно быстрее, но не дотягивают до фортрановских скоростей.

А вообще хотелось бы понять вот это «туда-сюда».

Ну вот, например, мне нужно изменить сортировку событий внутри файла: перемещать блоки по N строчек (количество не фиксировано) в определённой последовательности чтобы выстроить их правильно по времени.

skvitek ()
Ответ на: комментарий от skvitek

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

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

даже на stackoverflow открыто достаточно тредов по поводу Fortran vs C/C++ I/O и способов достижения в последних скорости первого

К сожалению, не видя конкретного обсуждения, мне трудно что-то комментировать, но могу предположить, что речь могла идти о синхронизации потоков си++ с потоками си, которая действительно замедляет операции ввода/вывода. И лечится это элементарно: отключается синхронизация, после чего используется только один тип потоков: либо сишный, либо крестовый. А в чистом си проблемы вообще нет.

aureliano15 ()
Ответ на: комментарий от skvitek

Но можно попробовать сгенерировать ASCII-файл на несколько гигабайт с переменной шириной строки и считывать оттуда значения парами/тройками/иликакнадо. В Фортране для этого нужно только задать формат - и программа будет читать пары/тройки/чтотамувас даже если между значениями будет перенос каретки. Мой опыт показал, что безопаснее для нервов тут Фортран.

Про скорость I/O то же самое: читать/писать несколько гигабайт ASCII и засекать время. Я обрабатываю подобные данные часто и периодически наблюдаю, как люди пробуют начать делать это на C/C++ по разными причинам... Опять же, когда важно делать это быстро - только Фортран.

Откройте уже для себя hdf5:

https://en.wikipedia.org/wiki/Hierarchical_Data_Format https://portal.hdfgroup.org/display/support

Ну и работать с этими фаилами потом можно без проблем из любого скриптового языка.

anonymous ()
Ответ на: комментарий от aureliano15

Поскольку чувак явно не может в программ конкретику, то остается только предположить, что в случае с C++ речь идет о чем-то вроде:

struct MyData {
  int a_;
  float b_;
  double c_;
};

std::vector<MyData> load_from(std::istream & from) {
  std::vector<MyData> v;
  while(from) {
    MyData d;
    from >> d.a_ >> d.b_ >> d.c_;
    v.push_back(d);
  }
  return v;
}

eao197 ★★★★★ ()
Ответ на: комментарий от anonymous

Ещё небольшой вопросик, чисто риторический - а ваш говноязычишко интегральную арифметику неограниченной разрядности завезли ? А плавучку с произвольной точностью ? А рациональный тип данных ? А тип матрица с элементом типа матрица (матрица из матриц, например, комплексных чисел) ?

Зачем это все в численных расчетах?

Zodd ★★★★ ()
Ответ на: комментарий от jamy

Ерунду говорите. Какие списки, о чём вы! Во-первых, производительность рухнет, должны быть эффективные массивы. Именно поэтому и Окамл. Во-вторых, представьте себе, что вам нужно взять срез многомерного массива откуда-нибудь из середины. Или хотя бы по столбцам. Это будет куча кода на любом ML и очень неэффективно.

Vudod ★★★★★ ()
Ответ на: комментарий от Vudod

Основной код можно писать на python, а тяжёлые куски, например, расчёт итерационных процессов и по разностным схемам запихивать в код на фортране и вызывать его посредством f2py:

https://scipy-cookbook.readthedocs.io/items/PerformancePython.html

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

grem ★★★★★ ()
Ответ на: комментарий от grem

Основной код можно писать на python, а тяжёлые куски, например, расчёт итерационных процессов и по разностным схемам запихивать в код на фортране и вызывать его посредством f2py:

Я так и делал до 2015. Но отдельные элементы сложных алгоритмов уже реализованы в большинстве случаев в scipy (хотя и не всё), а сшивки всё равно на Питоне пишутся.

Vudod ★★★★★ ()
Ответ на: комментарий от grem

Основной код можно писать на python, а тяжёлые куски, например, расчёт итерационных процессов и по разностным схемам запихивать в код на фортране и вызывать его посредством f2py

Пробовали. f2py - тот ещё гемор. Уж лучше cython какой-нибудь. Или ещё лучше julia.

yvv ★★★ ()
Ответ на: комментарий от Vudod

Какие списки, о чём вы! Во-первых, производительность рухнет, должны быть эффективные массивы. Именно поэтому и Окамл. Во-вторых, представьте себе, что вам нужно взять срез многомерного массива откуда-нибудь из середины. Или хотя бы по столбцам. Это будет куча кода на любом ML и очень неэффективно

Начнем с того что в том вашем сообщении на которое я ответил вы не говорили о срезах многомерного массива, а говорили о перемножении матриц. Поэтому я вам тонко намекнул что для этого вам не нужны обязательно массивы. Алгоритм же такой: читаем ячейку из матрицы A -> читаем ячейку из матрицы B -> умножаем значения и складываем в матрицу C -> инкрементим индекс -> повторяем действия, если не конец массива. Для этого списки подходят полностью.

Слабая производительность, но мы заранее знаем размеры матриц? Тогда просто меняем тип List на тип Vector (дополнительно нужно будет указать размер создаваемого вектора) и мы получаем тот же одномерный массив и константную скорость доступа к елементам.

Матрица большая и с трудом поместилась доступное ОЗУ? Ну тогда и массивы в ML тоже есть. Ну вот правда OCaml, для этих целей подходит с трудом, потому как даже примитивные типы обернуты и расход памяти больше, нежели если бы вы использовали MLton.

Я же говорил: «не тот вы диалект выбрали». OCaml - это для тех кто любит «поиграть» в ООП. И по факту он быстр, на мелких проектах либо на генерированном коде, когда чтение исходников не предполагается.

jamy ()
Ответ на: комментарий от Vudod

+ yvv

А сколько у вас обычно задачи считаются? Я помню, что задачи газовой динамики в 3d народ считает неделями/месяцами раскидав задачу на кучу компов (десятки миллионов ячеек). Хорошо, если химические процессы учитывать не нужно.

grem ★★★★★ ()
Ответ на: комментарий от aedeph_

Чувак, ты совсем не в теме, не позорься

Выше я уже ответил что это был тонкий намек, на то что в описанных им кейсах хватает и простых списков. Читайте внимательно, следите за контекстом. Мне позорится? Перед вами? Я вообще не вам писал. Если вас устраивают for/while loops лесенки, то я вас и не принуждаю, просто игнорируйте мои сообщения

jamy ()