首页 > 解决方案 > 将 OpenMP 编译为 WebAssembly

问题描述

我正在尝试将多线程应用程序编译为 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 编译为 Emscripten 使用的 llvm 字节码格式。为此,我尝试运行“emmake make”,以便 emscripten 框架使用合适的编译器执行 OpenMP makefile。由于 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."

有没有人知道我可以做些什么不同的事情?

标签: openmpemscriptenwebassembly

解决方案


推荐阅读