Am Donnerstag, dem 18.04.2024 um 14:01 +0200 schrieb Tobias Burnus: > Hi Janne, > > Janne Blomqvist wrote: > > back when I was active I did think about this > > issue. IMHO the best of my ideas was to convert these into C++ > > templates.
I haven't looked at libgfortran but I didn't find it problematic at all to use C in similar numerical code and this helps with portability. Either I use macros, which I keep short and then do not find inferior to templates (having used C++ for years previously) or - if there is really a lot of code that needs to be specialized for a type - simply by using includes: #define matmul_type double #include "matmul_impl.c" Martin > > I think this will work – but we have to be super careful: > > With C++, there is the problem that we definitely do not want to add > dependency on libstdc++ nor to use some features which require special > hardware support (like exceptions [always bad], symbol aliases, ...). — > On some systems, a full C++ support might be not available, like > embedded systems (including some odd embedded OS) or offloading devices. > > The libstdc++ dependency would be detected by linking as we currently > do. For in-language features, we have to ensure the appropriate flags > -fno-exceptions (and probably a few more). And it should be clear what > language features to use. > > If we do, I think that would surely be an option. > > > What we're essentially doing with the M4 stuff and the > > proposed in-house Python reimplementation is to make up for lack of > > monomorphization in plain old C. Rather than doing some DIY templates, > > switch the implementation language to something which has that feature > > built-in, in this case C++. No need to convert the entire libgfortran > > to C++ if you don't want to, just those objects that are generated > > from the M4 templates. Something like > > > > template<typename T> > > void matmul(T* a, T* b, T* c, ...) > > { > > // actual matmul code here > > } > > > > extern "C" { > > // Instantiate template for every type and export the symbol > > void matmul_r4(gfc_array_r4* a, gfc_array_r4* b, gfc_array_r4* c, ...) > > { > > matmul(a, b, c, ...); > > } > > // And so on for other types > > } > > Cheers, > > Tobias