【问题标题】:Use Emscripten with Fortran: LAPACK binding将 Emscripten 与 Fortran 一起使用:LAPACK 绑定
【发布时间】:2014-02-24 14:13:16
【问题描述】:

我的目标是将 LAPACK 与 Emscripten 一起使用。

我的问题是:如何将 LAPACK 移植到 JS?我能想到的方法有两种: CLAPACK to JS 我的问题是:有人知道 3.2.1 之后的非官方版本吗?而另一种思路是:如何将FORTRAN移植到JS?

Emscripten 能够将 C 代码转换为 JavaScript。但不幸的是,LAPACK 3.5.0 (http://www.netlib.org/lapack/) 仅在 FORTRAN95 中可用。

CLAPACK 项目 (http://www.netlib.org/clapack/) 基本上就是我想要的:LAPACK 的 C 版本。但是这个已经过时了;最新的是 3.2.1。

F2C 仅适用于 FORTRAN 77。LAPACK 3.5.0 是用 FORTRAN 95 编写的。

所以我现在的问题是:为什么没有 LAPACK 到 C 的更新端口?

最好的方法是直接将LAPACK的FORTRAN95代码转换成带有clang和emscripten的javascript。但我只是不知道从哪里开始。

Emscripten 目前不支持 FORTRAN。但它处理 LLVM 位码,所以使用 clang 从 FORTRAN 文件生成 LLVM bc 应该不是问题。

出于测试目的,我有这个文件:

      program hello
      print *, "Hello World!"
      end program hello

它可以用“clang hello.f -o hello -lgfortran”编译得很好。我无法将其转换为有效的位码。

clang -c -emit-llvm hello.f      
clang -S -emit-llvm hello.f -o hello.bc -lgfortran

这些方法都不起作用,因为 emscripten 一直在告诉我

emcc -c hello.o -o hello.js
hello.o is not valid LLVM bitcode

我不确定这是否可能,因为 LAPACK 显然需要 libgfortran 才能工作。而且我无法将库合并到 javascript 代码中...

提前致谢!

编辑:

我几乎设法将 BLAS 从 LAPACK 3.5.0 转换为 JS。我用dragonegg来完成这个。

gfortran caxpy.f -flto -S -fplugin=/usr/lib/gcc/x86_64-linux-gnu/4.6/plugin/dragonegg.so 
gfortran cgerc.f ...
...

从中获得 LLVM 位码后:

emcc caxpy.s.ll cgerc.s.ll cher.s.ll ... -o blas.js -s EXPORTED_FUNCTIONS="['_caxpy_', ... , '_ztpsv_']"

但是 emscripten 仍然给我留下以下错误:

warning: unresolved symbol: _gfortran_st_write
warning: unresolved symbol: _gfortran_string_len_trim
warning: unresolved symbol: _gfortran_transfer_character_write
warning: unresolved symbol: _gfortran_transfer_integer_write
warning: unresolved symbol: _gfortran_st_write_done
warning: unresolved symbol: _gfortran_stop_string
warning: unresolved symbol: cabs
warning: unresolved symbol: cabsf

AssertionError: Did not receive forwarded data in an output - process failed?

问题是我认为 lgfortran 是预编译的。

【问题讨论】:

  • CLAPACK 在标题中说 "f2c'ed version of LAPACK"。这个我没试过,但你为什么不在 LPACK 3.5.0 上运行f2c
  • 你写 所以我现在的问题是:为什么没有更新的 LAPACK 端口到 C? 但这不再是你的问题。该行是您早期版本问题的遗留问题,并且已经得到回答。在这个版本的问题中,我看不到 f2c 仅适用于 FORTRAN77 的声明;你对@Carsten 评论的回复有点草率。
  • 你是对的。我没有再次提及,这是上一个问题的复制和粘贴错误。抱歉 Carsten ;) 我的问题是:如何将 LAPACK 移植到 JS?我能想到的方法有两种: CLAPACK to JS 我的问题是:有人知道 3.2.1 之后的非官方版本吗?而另一种思路是:如何将FORTRAN移植到JS?
  • 我在想,你的最终目标是什么。你想用 JS 写一个数字运算应用程序吗?对我来说听起来是个坏主意……
  • 您在这方面取得了进展吗?你有没有看到这个 github 项目来获取 gfortran 的源代码并编译它。 github.com/alexleach/gfortran-mlion。这里有一个 SO 线程讨论这个问题:stackoverflow.com/questions/12316780/…

标签: javascript c fortran lapack emscripten


【解决方案1】:

感谢您的回复! 事实上,我确实在这方面取得了进展。最后它正在工作。我非常接近,只需按照以下步骤操作:

gfortran caxpy.f -S -flto -m32 -fplugin=dragonegg.so
mv caxpy.s caxpy.ll
llvm-as caxpy.ll -o caxpy.o

注意我之前错过的“m32”标志。

类似警告

warning: unresolved symbol: _gfortran_st_write

可以安全地忽略。 Emscripten 在 JavaScript 文件中使用此名称创建空函数,因此如果根本不调用这些函数,则没有问题。如果它们被调用,您可以轻松地将它们替换为您自己的函数;这些名称有点描述性。此外,您可以查看 libgfortran 源代码(注意它是 GPL)。

有了这个 Emscripten 源可以手动扩展以支持 Fortran 文件。有一天我可能会在 github 上发布这个!

【讨论】:

  • 如何将您的位码转换为 javascript?谢谢!哪个 emscripten 命令可以做到这一点?
  • 我不知道这是否可以通过 emscripten 命令实现。在内部它是通过 >> shared.Building.llvm_as(fortran_llvm, output_file) # create .o file from .ll See: github.com/kripken/emscripten/issues/998 for a complete example
  • @japedo 你有机会把你的代码放到 github 上吗?
【解决方案2】:

我最近真的成功了 (https://github.com/harveywi/arpack-js)。除了输出的 JS 文件之外,Github 存储库大多是贫瘠的,但我很快就会上传源代码、Makefile 和其他说明。在与 Dragonegg 争吵了一段时间后,我发现了一种不同的方法(不是那么好,但足够了)。

我大致是这样做的:

  1. 下载ARPACK源代码。
  2. 对所有 Fortran 文件运行 f2c 以将它们转换为 C。
  3. (这可能是最棘手的部分):修改 Makefile 以使用 EmscriptenLLVM 工具链。
  4. 制作项目以生成 LLVM 二进制文件。
  5. 再次使用 Emscripten 将 LLVM 二进制文件转译为 JS。

【讨论】:

  • 问题在于问题是关于 LAPACK 3.5。 f2c 无法编译此新版本。我认为没有人对与 f2c 一起使用的代码有任何问题,因为您可以使用所有通常用于 C 代码的代码。引用问题:“F2C 仅适用于 FORTRAN 77。LAPACK 3.5.0 是用 FORTRAN 95 编写的。”
  • @william - 你打算进一步推进这个项目吗?这太酷了,您应该真正构建它。例如,如果您可以集成 lodash 的一两个功能来直接利用 ARPACK……那将是巨大的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-30
  • 2015-05-15
  • 2013-06-18
相关资源
最近更新 更多