I am creating a dedicated thread for the Enzyme + Fortran integration, which started here:
@lpaehler, regarding this:
I think you are using Flang in there.
We can also use LFortran. To get LLVM out of it, one can do:
lfortran --show-llvm some_file.f90 > some_file.ll
Then you work on the LLVM as you do, and then you compile to object file (some_file.o
) using LLVM tools and link it:
lfortran -o executable some_file.o
What are your ideas to simplify this workflow?
Just had a very brief look and think it should be possible to make LFortran interact smoothly with Enzyme, the question I am asking myself here is whether it would be possible to make LFortran accept Enzyme as a plugin?
In such a case Enzyme’s usage in Fortran could be simplified to something like this (just guessing at the syntax here right now, orienting on similar C++ code):
lfortran -Xfortran -load -Xfortran /temp/Enzyme/build/LFortranEnzyme-13.so some_file.f90 -I ./ -c -o some_file.o
lfortran -Xfortran -load -Xfortran /temp/Enzyme/build/LFortranEnzyme-13.so some_file.f90 -o executable some_file.o
Right now, as is, one could quite probably run Enzyme with LFortran as follows:
- Use LFortran to compile code into LLVM IR
lfortran --show-llvm some_file.f90 > some_file.ll
- Use the opt of the LLVM Enzyme was built against, this needs to be the same LLVM version as the one provided by LFortran
opt some_file.ll -load=/path/to/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-<VERSION>.so -enzyme -o some_file_differentiated.ll -S
- Run an optimization pass and compile this into the final binary
LFortran -O3 -o executable some_file_differentiated.ll
Which is pretty much what you summarized above, just with the written out intermediate step. The much easier step would be if one could load Enzyme like an LLVM-Plugin into LFortran, and then we could use the simplified workflow outlined above.
Currently we don’t do plugins, but we should. Is Enzyme just an LLVM plugin? I think we need to implement loading LLVM plugins in the main lfortran
driver. Then it would be simple to use. Great idea. I created an issue for this: Allow to load LLVM plugins (#635) · Issues · lfortran / lfortran · GitLab
Enzyme is loaded into LLVM as a LLVM plugin. When you enable the loading of LLVM plugins it should mostly just work.
@certik I would also highly recommend attending our LLVM tutorial on Friday. We have a whole section on the how-to of including Enzyme in a new compiler front-end, the integration of LLVM generation, optimization with opt, the use of an LLVM-plugin, link-time optimization, and Enzyme’s API.
Can you send information how to attend?
With Enzyme being moved to official LLVM Incubator Project status, Enyzme now also has its own Subthread on the LLVM Discourse:
Feel free to ask as many questions re the integration