Ответ 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.) Все работает гладко, до сих пор у меня не было проблем.