Are there some switches to force the compiler to initialize the variable, or some tools to help me find which variable was used before initialized?
The flag “-Msave”, which adds the SAVE attribute to all variables, has the side-effect of initializing variables to zero. Though, I’d only use this as a stop-gap while you find the uninitialized variables.
I personally like to use Valgrind (www.valgrind.org) to help in finding memory errors, including UMRs.
2.why pgf90 do not support the data type real*16? If so, what is superiority of 64-bit?
Quad-precision (aka REAL*16) is a 128-bit data-type while the 64-bit in AMD64 is referring to 64-bit addressing. The superiority of 64-bit addressing is in allowing access to objects that are over 2GB in size.
For floating point computations, modern x86 processors have added SIMD units such as SSE and AVX which have various data widths such as 128, 256, and 512. However in each case, the actual allowed data types used in computations are either single (32-bit) or double (64-bits). While the SIMD units can do multiple simultaneous computations of single or double precision data types, they do not support 128-bit floating point computations.
Since there is no hardware support for quad-precision, there are only two ways to support it, either pretend to use it or go very slow.
By “pretend to use it”, I mean that sometimes REAL16 is “supported” by using the 80-bit x87 instructions. In other words, map REAL16 to REAL*10 and pretend that’s quad.
By “go very slow”, I mean use software emulation to simulate quad-precision which can be quite slow.
Neither are good choices so we decided to not support REAL*16 until there is hardware support for 128-bit floating point data types. Plus there are several third-party software solutions, such as libquadmath, which simulate quad-precision which you can use.
Hope this helps,