when using pgf90 on AMD64

Questions when using pgf90 on AMD64
1.when I compile the FORTRAN source code in 32-bit, the variables are all initialized to zero by default. This is what I want. But when I compile the FORTRAN source code in 64-bit, then the variables cannot be initialized by default. 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? This is important to me, because some old software running correctly in 32-bit when the variables are not initialized by hand. If find which variable was used before initialized by hand when porting 32-bit to 64-bit, it will be loaded down with trivial details..


2.why pgf90 do not support the data type real*16? If so, what is superiority of 64-bit?

Details:
Compiler: pgf90 v.5.2
OS: Turbo Linux 2.4.21-4smp 64 bit
Hardware: Opteron 2.4G

Hi oliviakennedy,

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,
Mat