Ржавчина на сетчатых вычислениях

Я ищу для создания Rust-реализаций некоторых небольших программ биоинформатики для моих исследований. Одним из моих основных соображений является производительность, и хотя я знаю, что могу запланировать запуск программы Rust на сетке с qsub - кластер, к которому у меня есть доступ, к использованию Oracle GridEngine - я беспокоюсь, что тот факт, что я не звоню MPI напрямую вызовет проблемы с производительностью программы Rust.

Будет ли планирование программы без использования библиотеки MPI сильно затруднить производительность? Должен ли я использовать библиотеку MPI в Rust, и если да, существуют ли какие-либо известные библиотеки MPI для Rust? Я искал один, но ничего не нашел.

Ответ 1

Я использовал несколько суперкомпьютерных средств (я астрофизик) и часто сталкивался с одной и той же проблемой: я хорошо знаю C/С++, но предпочитаю работать с другими языками.

В общем, любой подход, отличный от MPI, будет делать, но считают, что часто такие суперкомпьютеры имеют сильно оптимизированные библиотеки MPI, часто адаптированные для конкретного оборудования, интегрированного в кластер. Трудно сказать, насколько повлияет производительность ваших программ Rust, если вы не используете MPI, но самая безопасная ставка - остаться с реализацией MPI, предоставляемой в кластере.

Отсутствие штрафа за производительность при использовании оболочки Rust вокруг библиотеки C, такой как библиотека MPI, поскольку узким местом является время, необходимое для передачи данных (например, через MPI_Send) между узлами, а не незначительная стоимость дополнительного вызова функции, (Более того, это не относится к Rust: нет дополнительного вызова функции, как уже было сказано выше).

Однако, несмотря на очень хорошую FFI, предоставленную Rust, создавать привязки MPI нелегко. Проблема заключается в том, что MPI не является библиотекой, а спецификацией. Популярные библиотеки MPI - OpenMPI (http://www.open-mpi.org) и MPICH (http://www.mpich.org). Каждый из них немного отличается тем, как они реализуют стандарт, и обычно они покрывают такие различия с использованием макросов препроцессора C. Очень немногие FFI могут иметь дело со сложными макросами; Я не знаю, как выглядит Rust здесь.

В качестве примера я реализую программу MPI в Free Pascal, но не смог использовать существующие привязки MPICH (http://wiki.lazarus.freepascal.org/MPICH), так как кластер, который я использую, предоставляет свою собственную библиотеку MPI, и я предпочитаю использовать ее по указанной выше причине. Я не смог повторно использовать привязки MPICH, поскольку они предположили, что константы, такие как MPI_BYTE, представляют собой твердые кодированные целочисленные константы. Но в моем случае они являются указателями на непрозрачные структуры, которые, кажется, создаются при вызове MPI_Init.

Связывание Julia с MPI (https://github.com/lcw/MPI.jl) решает эту проблему, запуская программы C и Fortran во время установки, которые генерируют код Julia с правильным значения для таких констант. См. https://github.com/lcw/MPI.jl/blob/master/deps/make_f_const.f

В моем случае я предпочел реализовать промежуточное программное обеспечение, например, небольшую библиотеку C, которая объединяет вызовы MPI с более "предсказуемым" интерфейсом. (Это более или менее то, что делают привязки Python и Ocaml, см. https://forge.ocamlcore.org/projects/ocamlmpi/ и http://mpi4py.scipy.org.) Все работает гладко, до сих пор у меня не было проблем.

Ответ 2

Будет ли планирование программы без использования библиотеки MPI сильно затруднить производительность?

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

Но существуют и другие подходы, такие как семейство PGAS (Chapel, OpenSHMEM, Co-array Fortran) или альтернативные сообщения, например, что используется Charm ++.

MPI "просто" обеспечивает (очень полезную, очень портативную, агрессивно оптимизированную) абстракцию обмена сообщениями, но пока у вас есть способ управления parallelism, вы можете запускать что-либо в кластере.