Компиляция OpenMP в WebAssembly - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь скомпилировать многопоточное приложение в WebAssembly. Приложение использует OpenMP для многопоточности. Для компиляции я использую платформу Emscripten.

Я уже скачал исходные файлы для OpenMP и скомпилировал его для моего хоста с помощью make. С помощью следующей команды я могу связать ее с простым демонстрационным приложением на моей машине:

g++ -Wall -Werror -pedantic main.o -o main.x /$PATH_TO_OPENMP/build/runtime/src/libgomp.a -pthread -lstdc++ -Wl,--no-as-needed -ldl

Затем я попытался скомпилировать OpenMP в формат байт-кода llvm, используемый Emscripten. Для этого я попытался запустить emmake make, чтобы платформа emscripten выполняла файлы сборки OpenMP с подходящим компилятором. Поскольку emscripten не любит общие объектные файлы, я скомпилировал их в статическую библиотеку .a файлы. Это работает и фактически дает мне объектные файлы, на которые я могу ссылаться.

Затем я хотел связать мое демонстрационное приложение с помощью следующей команды

em++ -Wall -Werror -pedantic main.o -o main.html /home/main/data/Programming/openMP/openmp_web/build/runtime/src/libgomp.a -pthread -lstdc++ -Wl,--no-as-needed -ldl

Но я получаю эти предупреждения, что он не может ссылаться на файлы OpenMP:

shared:WARNING: object /tmp/emscripten_temp_ONa0eU_archive_contents/kmp_atomic.cpp.o is not a valid object file for emscripten, cannot link
                              .
                              .
shared:WARNING: object /tmp/emscripten_temp_ONa0eU_archive_contents/kmp_str.cpp.o is not a valid object file for emscripten, cannot link
shared:WARNING: object /tmp/emscripten_temp_ONa0eU_archive_contents

Итак, я решил, что я должен скомпилировать OpenMP с неверным компилятором. Затем я попытался изменить компилятор при сборке библиотеки с помощью следующих команд:

cmake -DCMAKE_C_COMPILER=emcc -DCMAKE_CXX_COMPILER=em++ -DLIBOMP_LIB_TYPE=normal -DLIBOMP_ENABLE_SHARED=OFF -DCMAKE_BUILD_TYPE=Release -DLIBOMP_ARCH=x86_64 OPENMP_STANDALONE_BUILD=1 ..
emmake make

Но это приводит к странным ошибкам в некоторых пропущенных системных переменных

/home/main/data/Programming/openMP/openmp_web/runtime/src/kmp_platform.h:82:2: error: Unknown OS
/home/main/data/Programming/openMP/openmp_web/runtime/src/kmp_platform.h:203:2: error: Unknown or unsupported architecture
In file included from /home/main/data/Programming/openMP/openmp_web/runtime/src/kmp_alloc.cpp:13:
In file included from /home/main/data/Programming/openMP/openmp_web/runtime/src/kmp.h:77:
/home/main/data/Programming/openMP/openmp_web/runtime/src/kmp_os.h:171:2: error: "Can't determine size_t printf format specifier."

Кто-нибудь имеет представление о том, что я мог бы сделать по-другому?

...