The meaning of "machine accuracy"

Hello.
I am using the cuSOLVER eigen-decomposition function cusolverDnCheevjBatched, and I see the documentation says the default value for the tolerance is “machine accuracy”.

I am not sure exactly what that means, and since there is no function to read it but only a cusolverDnXsyevjSetTolerance to set it, I cannot know for sure.
Does anyone have an idea of what the machine accuracy is? I assume it’s probably 2^-24 for single precision.

Hi Spraesi,

may I ask why you use CheevjBatched and not cusolverDnXsyevBatched? What is your typical input matrix size?

It’s just because I am targeting CUDA 11.8 (October 2022) and above.
I call CheevjBatched to speed up computations in MATLAB R2024b, which supports CUDA 12.2 “natively”, and the input is a 351x351x24 tensor.

Seems cusolverDnXsyevBatched was added quite recently with CUDA 12.6.2 (October 2024), but I am really curious if it is faster than CheevjBatched and to see if it does not have the issue mentioned in syevjBatched cannot be run asynchronously (because it seems I can at least pin the host-side workspace memory).
I just haven’t had time to check it out yet, and I’ll proably wait till a MATLAB release, where it is “natively” supported, so I do not have to compile statically with cuSOLVER (to avoid conflicting libraries) to use it.
Should I expect a speed-up using cusolverDnXsyevBatched over CheevjBatched?

In the documentation for syevj, it states

If the user sets an improper tolerance, syevj may not converge. For example, tolerance should not be smaller than machine accuracy.

And in the corresponding code example, it says in a comment “default value of tolerance is machine zero”.

So this implies the default tolerance value is some non-zero value, probably 2^-23 for floats.

The new API cusolverDnXsyevBatched does not support setting the tolerance, which is also a shame since increasing the tolerance greatly improved the speed without reducing the quality in my case.