В течение периода объединения сообщества я буду компилировать некоторые библиотеки физического моделирования с помощью Emscripten и запускать примеры, представленные в их исходном коде. Я сосредоточусь на примерах, которым требуется доступ к файлам данных, содержащим различные физические параметры. Это пригодится позже для тестирования серверной части CernVM-FS Emscripten, которую я буду реализовывать.

Я начну с PYTHIA, библиотеки C++, используемой для моделирования явлений физики высоких энергий. Вы можете скачать его исходный код здесь. Я использовал версию 8.235.

Компиляция

Это самая простая часть. Из каталога исходного кода PYTHIA запустите

$ emconfigure ./configure
$ emmake make

и вы сделали!

Это заполнит каталог tmp файлами *.o. Но это не ваши обычные файлы ELF.

$ file tmp/Analysis.o
tmp/Analysis.o: LLVM IR bitcode

Компилятор Emscripten создал файлы битового кода LLVM IR и упаковал их в архивный файл lib/libpythia8.a.

Запуск примера

Давайте запустим пример 3, main03.cc в каталоге examples. Эта программа ожидает найти входной командный файл main03.cmnd в своем текущем каталоге при запуске, а также каталог файлов данных в <pythia-dir>/share/Pythia8/xmldoc в том же месте.

Итак, из каталога examples запустите

$ emmake make main03
em++ main03.cc -o main03 -I../include -O2  -pedantic -W -Wall -Wshadow -fPIC -L../lib -Wl,-rpath,../lib -lpythia8 -ldl
$ file main03
main03: LLVM IR bitcode

Мы снова сгенерировали биткод LLVM IR. Чтобы создать конечную цель для браузера, запустите

$ mv main03 main03.bc
$ em++ main03.bc -o main03.html -O2 \
    -s WASM=1 \
    --preload-file main03.cmnd \
    --preload-file ../share/Pythia8/xmldoc@<pythia-dir>/share/Pythia8/xmldoc \
    -s TOTAL_MEMORY=50MB

Давайте сломаем это

  • Нам пришлось переименовать main03, потому что иначе em++ не распознает тип файла.
  • -s WASM=1 создаст WASM вместо asm.js, который используется по умолчанию.
  • --preload-file main03.cmnd загрузит этот файл в память, когда к нему будет обращаться программа C++, и он будет храниться в корневом каталоге программы (который также является ее текущим каталогом, когда она начинает выполняться).
  • --preload-file ../share/Pythia8/xmldoc@<pythia-dir>/share/Pythia8/xmldoc аналогичен приведенному выше, он загружает весь каталог xmldoc, но вместо того, чтобы появиться в корне, он появится по пути, указанному после @, где программа ожидает его найти.
  • -s TOTAL_MEMORY=50MB устанавливает максимальный предел памяти для программы, который является увеличением по умолчанию. Я получил это значение, начав с размера каталога xmldoc и немного проб и ошибок. Вероятно, его можно еще уменьшить.

По умолчанию Emscripten использует 64-битные удвоения для всех значений с плавающей запятой, что может привести к различным ошибкам округления в коде WASM по сравнению с собственным кодом. Если это проблема, вы можете передать -s PRECISE_F32=1, который указывает Emscripten использовать 32-битные значения с плавающей запятой везде, где float используется в коде C/C++.

Конечными выходными файлами теперь будут: main03.html, main03.js, main03.wasm и main03.data (предварительно загруженные файлы).

Чтобы запустить эту программу в браузере, выполните

$ emrun main03.html

Преимущество использования emrun вместо простого открытия main03.html заключается в том, что emrun будет обслуживать все выходные файлы через локальный веб-сервер, что позволяет избежать некоторых проблем CORS, связанных с их обслуживанием из файловой системы.

Программа не будет отображать никаких результатов, пока не завершит выполнение, что может занять несколько секунд, в зависимости от вашего браузера/компьютера.

Я также разместил пример здесь, если вы хотите сразу увидеть демо.