When studying the code of Lapacke, I found that DGESDD calls DBDSDC (http://www.n etlib.org/lapack/explore-html/d9/d08/dbdsdc_8f_source.html), which does the divide and conquer of bidiagonal matrix. When DBDSDC handles bidiagonal matrix, it first check if the diagonal value less than machine epsilon (in line 403 - 407) and upscale the small values. My question is that whether the upscale operation is needed.

My conjectures for this upscale operation is either speedup the program or numerical stability reason. I've tried to debug for both reasons, but cannot find evidence for either cases.

For speedup, originally I thought the upscale will produce many same value of diagonal entries, and this can help deflation later. But in reality, those upscaled values are so small that it's not even calculated in the deflation part. Instead, those are considered to be singular value directly in the program.

For numerical stability, I tried using broken arrow matrix A (so I can control the singular values and condition number) and adding some noise delta_A. I find that small noise won't affect the leading singular values no matter I have the upscale or not. Noise only affects those small singular values, but it didn't show instability if I turn off this upscale operation. In addition, we found that in our application, if we comment the upscale out, we can achieve higher accuracy, such that DGESDD is comparable with DGESVD.