В течение периода объединения сообщества я буду компилировать некоторые библиотеки физического моделирования с помощью 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, связанных с их обслуживанием из файловой системы.
Программа не будет отображать никаких результатов, пока не завершит выполнение, что может занять несколько секунд, в зависимости от вашего браузера/компьютера.
Я также разместил пример здесь, если вы хотите сразу увидеть демо.