SET_XERBLA - override the error-handler without linker stuff - #1407
SET_XERBLA - override the error-handler without linker stuff#1407mohawk2 wants to merge 10 commits into
SET_XERBLA - override the error-handler without linker stuff#1407Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #1407 +/- ##
=======================================
Coverage 69.36% 69.36%
=======================================
Files 6122 6124 +2
Lines 486711 486783 +72
Branches 23268 23270 +2
=======================================
+ Hits 337584 337654 +70
Misses 148689 148689
- Partials 438 440 +2
Continue to review full report in Codecov by Harness.
|
|
Hi @mohawk2, I like the idea a lot, since it would solve all the problems we currently have with error testing (e.g., it doesn't work with shared Windows libs or two-level namespaces) and make it easier for users to use a custom xerbla on all platforms. A few things to consider:
|
|
There is also a possibility of defining it as a weak symbol so tests can override the regular one. that can limit the surgery to only xerbla. overall I don't think xerbla is a good way to report errors back but it is what it is for now. |
Yes, that's how it's currently done in the CBLAS test suite. Won't work on Windows, though. Also, doing that in Fortran would depend on the compilers supporting it (nagfor doesn't without major hacks, ifx & flang maybe). |
|
I do use it on windows albeit on a C translation and Clang.
ah then nevermind. Sorry for the noise |
Ah, you're right; Clang and Intel do support it on Windows for static libraries. Did you try it with a shared library? Because last time I checked, that was the blocker. |
|
Thank you all for your quick responses! As noted in my edit of the PR description, I'm intending to add CBLAS and LAPACKE equivalents. I'll ponder the names, I hadn't properly checked prior art and will do so now. I'll ponder the idea of different BLAS and LAPACK handlers - is it really true that the current implementation essentially has two similarly-named symbols that are each are getting overridden by the user-supplied one? If so, that seems horrible. I might need to make differently-named entry points for each that call each other, since the user expectation will be a full override for both. |
Yes, I think using the same REGISTER_XERBLA symbol name in BLAS and LAPACK could mean it only replaces one of the handlers (if we use separate shared libraries). My sugestion would be to have the separate symbols and then one symbol that does both and lives in LAPACK. Something like this: Edit: One issue would be that when we are compiling LAPACK with a vendor BLAS lib and they don't implement |
My pondering came up with a similar result, but not identical (see below). The above discussion included the point that prior art (
Edit 1: specify that
Yes, that sounds like a good approach. |
|
My thinking so far on a CBLAS approach (The LAPACKE version will be mutatis mutandis, so will not be addressed separately). CBLAS has an actual
For the CBLAS versions of the 3 procedures plus
|
REGISTER_XERBLA - override the error-handler without linker stuffSET_XERBLA - override the error-handler without linker stuff
149c4ce to
2449269
Compare
@ACSimon33 I've had to adjust the plan a bit; a BLAS |
2449269 to
3d68c71
Compare
|
@mohawk2 Can you please merge the current master back into your branch? We now fixed numerical issues and errors on all platforms that are tested in CI, and the CI jobs are now configured to fail if new errors occur. |
Working on this now, thank you for highlighting this. |
34e2172 to
148a3b6
Compare
|
@ACSimon33 @langou I've just rebased this to latest |
|
@ACSimon33 @langou Sorry about this! I'm pretty sure the Makefile jobs in CI will fail, because I missed updating the Makefiles to add the 2 new files due to inept |
|
@ACSimon33 @langou Pushed. Works locally (and confirmed that without the new commit, it broke). |
|
Flang is failing with: Some preliminary searching indicates this is because it doesn't like the combination of procedure pointers, and @ACSimon33 How do you want to proceed? If you can't accept breaking Edit: also codecov is saying it's failing because this part doesn't get exercised: if (.not. associated(active_callback)) then
print *, 'Error: LAPACK_XERBLA called but no callback registered'
stop
end ifI had that in there because I thought it was better than a |
|
@ACSimon33 (sorry for all the highlights) I have opened #1411 further to my last comment, and will get started on instead using |
|
@mohawk2 Try removing the |
@ACSimon33 I'm a bit reluctant! That would break returning the previous handlers on the C side. I'm comfortable with adjusting the Edit: clarify tangled wording. Further info: the |
Right, we need it there. I don't have a specific preference about how we fix this, since I'm not a Fortran expert. Using a C function pointer with an internal indirection would work like this, I think: But as I said, I'm fine with either way. |
@ACSimon33 Great, I'm already figuring how to wend my way through the logic and regex stuff in the CMake code. Please could you look at #1411? That would really help. |
Description
Currently, to override BLAS/LAPACK's handling of errors involves defining a
xerbla_(or sometimesxerbla) symbol in your library/executable. This may not work in 2-level namespace environments like macOS.Instead, this PR allows you to call
SET_XERBLA(Fortran) with a replacement handler, orNULL()to reset to default. There is also anGET_(library)_XERBLA. This does not address that the new handler must be a Fortran-compatible routine.There are CBLAS (
cblas_set_xerbla) and LAPACKE (LAPACKE_set_xerbla) handlers on the way, but I'm putting this up for review as I believe it already adds value.I have marked below that the documentation has been updated, because I added a paragraph in the doc-comments of
xerbla.f. If more is needed, please let me know.EDIT: updated function names.
Checklist