Я хочу, чтобы Python был интерфейсом, а Fortran — сервером. Я также хочу сделать часть fortran параллельной - лучшая стратегия?

У меня есть скрипт python, который я надеюсь сделать примерно так:

  1. вызывает некоторые позиции частиц в массив

  2. запускает алгоритм по всем 512 ^ 3 позициям, чтобы распределить их по матрице NxNxN

  3. верните эту матрицу обратно в python

  4. используйте графику в python для визуализации матрицы (т.е. Mayavi)

Сначала я должен написать это последовательно, но в идеале я хочу распараллелить шаг 2, чтобы ускорить вычисления. Какие инструменты/стратегии могут помочь мне начать. Я хорошо знаю Python и Fortran, но не знаю, как связать их для решения моей конкретной задачи. На данный момент я делаю все на Фортране, а затем загружаю свою программу на Python - я хочу сделать все это сразу. Я слышал о py2f, но я хочу узнать мнение опытных людей, прежде чем спуститься в одну конкретную кроличью нору. Спасибо

Редактировать: то, что я хочу сделать параллельным, является «неловко параллельным» в том смысле, что это просто петля из N частиц, и я хочу пройти через эту петлю как можно быстрее.


person Griff    schedule 13.12.2012    source источник


Ответы (3)


У вас есть два основных варианта привязки. Первый, чтобы использовать f2py, другой, чтобы использовать совместимость с C в вашем Fortran и связываться с использованием Cython. Учебник по f2py находится здесь. Это совсем не сложно, есть некоторые директивы для f2py, которые нужно поместить в свой код на Фортране, но часто они не нужны.

Для распараллеливания первым подходом к использованию, вероятно, является OpenMP, если вам достаточно распараллеливания на одной машине. Он использует потоки и прост в использовании для циклов с неудобным параллелизмом. Просто убедитесь, что вы не записываете какие-либо глобальные переменные в потоках, и если да, используйте для этого директивы синхронизации.

person Vladimir F    schedule 13.12.2012
comment
Мне лично нравится f2py — что касается распараллеливания на одной машине, то это не намного проще, чем multiprocessing в Python. Вам не нужно беспокоиться о безопасности потоков, поскольку все выполняется как отдельный процесс. - person mgilson; 13.12.2012
comment
Это то, что мне нравится в массивах (и MPI, но это не так просто). На самом деле я использую Python только для постобработки, я не нашел себя более продуктивным, чем Fortran для вычислительного кода. Отчасти из-за необходимости часто переключаться между соглашениями об индексации массивов NumPy и Fortran. В связи с этим я считаю использование Python шагом назад по сравнению с Chapel. - person Vladimir F; 14.12.2012
comment
Если у меня есть numpy - у меня есть f2py? Я пробую там примеры, но получаю ошибки компиляции. - person Griff; 14.12.2012
comment
Ну, я не знаю, какую платформу и дистрибутив Python вы используете. В Linux, скорее всего, да, просто проверьте свой менеджер пакетов. В винде, честно говоря, не знаю. - person Vladimir F; 14.12.2012
comment
@VladimirF знаете ли вы очень простой учебник по опции Cython? Я закис на f2py... - person bdforbes; 14.12.2012

Альтернативный подход к предложению VladimirF может состоять в том, чтобы настроить две части как конструкцию клиент-сервер, где ваша часть Python может общаться с частью Fortran, используя сокеты. Хотя это сопряжено с необходимостью реализации некоторого протокола для взаимодействия, это имеет то преимущество, что вы получаете четкое разделение и даже можете продолжать запускать их на разных машинах с взаимодействием по сети.

На самом деле, при таком подходе вы даже можете выполнить неприятную параллельную часть, создав столько экземпляров приложения Fortran, сколько необходимо, и снабдив их разными данными.

person haraldkl    schedule 13.12.2012

Скорее ответ, чем комментарий в том же направлении, что и @haraldkl - в настоящее время я использую сокеты для отправки данных из Fortran в Ptyhon и наоборот. Минимальный рабочий пример можно найти в этом репозитории. Сокеты в Fortran немного сложны, так как нет встроенной библиотеки, поддерживающей их, и вам нужно использовать обертку вокруг библиотеки C. Тем не менее, отлично работает.

Моя идея состоит в том, чтобы включить эту стратегию в более крупный параллельный код Fortran, который у меня есть, хотя я еще не разобрался с этой частью. Возможно, сработают потоки сокетов в Python и использование нескольких портов.

person b-fg    schedule 05.04.2019