em_js javascript c fortran lapack emscripten

javascript - em_js - Utilice Emscripten con Fortran: enlace LAPACK



emscripten em_js (2)

Mi objetivo es usar LAPACK con Emscripten.

Mi pregunta es: ¿cómo portar LAPACK a JS? Hay dos formas en que se me ocurre: CLAPACK to JS, donde mi pregunta es: ¿Alguien sabe una versión no oficial que es posterior a 3.2.1? Y la otra forma de pensar es: ¿cómo portar FORTRAN a JS?

Emscripten es capaz de transformar el código C en JavaScript. Pero desafortunadamente, LAPACK 3.5.0 ( http://www.netlib.org/lapack/ ) solo está disponible en FORTRAN95.

El proyecto CLAPACK ( http://www.netlib.org/clapack/ ) es básicamente lo que quiero: una versión C de LAPACK. Pero este está desactualizado; el último es 3.2.1.

F2C solo funciona con FORTRAN 77. LAPACK 3.5.0 se escribió en FORTRAN 95.

Entonces mi pregunta ahora es: ¿por qué no hay un puerto más nuevo de LAPACK a C?

La forma óptima sería transformar directamente el código FORTRAN95 de LAPACK en javascript con clang y emscripten. Pero simplemente no sé por dónde empezar.

Emscripten actualmente no es compatible con FORTRAN. Pero maneja el código de bits LLVM, por lo que no debería ser un problema usar clang para generar LLVM bc desde un archivo FORTRAN.

Para fines de prueba, tengo este archivo:

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

Compila muy bien con "clang hello.f -o hello -lgfortran". No soy capaz de transformar esto en un código de bits válido.

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

Ninguno de estos enfoques funciona, porque emscripten me sigue diciendo

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

De todas formas, no estoy seguro si esto fuera posible, porque LAPACK obviamente necesita libgfortran para trabajar. Y no puedo fusionar una biblioteca en código JavaScript ...

¡Gracias por adelantado!

Editar:

Casi logré convertir BLAS de LAPACK 3.5.0 a JS. Usé dragonegg para lograr esto.

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

Después de obtener el código de bits LLVM de eso:

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

Pero emscripten todavía me deja con los siguientes errores:

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?

El problema es que lgfortran está precompilado, creo.


¡Gracias por su respuesta! De hecho, hice progresos en esto. Finalmente está funcionando. Estaba muy cerca, solo sigue estos pasos:

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

Tenga en cuenta la bandera "m32" que me perdí antes.

Advertencias como

warning: unresolved symbol: _gfortran_st_write

puede ser ignorado de forma segura. Emscripten crea funciones vacías en el archivo JavaScript con este nombre, por lo que si no se invocan estas funciones, no hay problema. Si son llamados, puede sustituirlos fácilmente con sus propias funciones; los nombres son algo descriptivos. Además, puedes echarle un vistazo al código fuente de libgfortran (ten en cuenta que es GPL).

Con esta fuente Emscripten se puede extender a mano para admitir archivos Fortran. ¡Algún día puedo publicar esto en github!


De hecho, logré esto recientemente ( https://github.com/harveywi/arpack-js ). El repositorio de Github es prácticamente estéril excepto por los archivos JS de salida, pero pronto subiré el código fuente, los archivos Makefiles y otras instrucciones. Después de forcejear infructuosamente con dragonegg por un tiempo, encontré un enfoque diferente (no tan bueno, pero suficiente) que funcionó.

Aquí es más o menos cómo lo hice:

  1. Descargue el código fuente de ARPACK .
  2. Ejecute f2c en todos los archivos de Fortran para convertirlos a C.
  3. (Esta podría ser la parte más complicada): modifique los Makefiles para usar las cadenas de herramientas Emscripten y LLVM .
  4. Haga el proyecto para producir un binario LLVM.
  5. Use Emscripten nuevamente para transpilar el binario LLVM a JS.