memory, a Fortran90 code which declares and uses a sequence of larger and larger arrays, to see what the memory limits are on a given computer.
The program tries an increasing series of values of N, using powers of 2, between limits that you set. At some point, the program may ask for more memory than can be provided, and crash. This is one way to find out what the memory ceiling is! The relevant power of 2 is likely to be in the 20's:
Log(N) | N |
---|---|
20 | 1,048,576 |
21 | 2,097,152 |
22 | 4,194,304 |
23 | 8,388,608 |
24 | 16,777,216 |
25 | 33,554,432 |
26 | 67,108,864 |
27 | 134,217,728 |
28 | 268,435,456 |
29 | 536,870,912 |
30 | 1,073,741,824 |
Remember that your memory is probably described in terms of bytes, but that integers and reals require 4 bytes, and double precision reals require 8 bytes.
The use of very large arrays in a perfectly legal program can cause a failure that appears as a segmentation fault.
This might be caused, for instance, by the use of automatic arrays in a subprogram. An automatic array is one whose dimension is passed into the subprogram as an argument, but whose memory is only created when the subprogram is entered. Some compilers, presumably expecting such arrays to be small, use memory from the stack; if the available memory is exceeded, the program crashes.
You might be able to make such an error go away by replacing the automatic arrays by explicitly allocated arrays. Their memory comes from the heap, which is, typically, a more substantial resource.
You could allocate the arrays in the calling program.
On Unix, you can determine the current stacksize, in kilobytes, by the command
ulimit -S -sMy system reported the value as "8192". You can increase this limit to a numeric value:
ulimit -S -s 16384or simply ask that it be unlimited using the command:
ulimit -s unlimited
Alternatively, your Fortran compiler may have a switch that controls the size of the stack, or that changes the method of getting memory for automatic arrays. For the Intel ifort compiler, the switch -heap-arrays [n] means that arrays larger than n will be assigned memory from the heap rather than the stack.
memory log_n_min log_n_maxruns the program for sizes N = 2log_n_min to 2log_n_max.
The information on this web page is distributed under the MIT license.
memory is available in a C version and a C++ version and a Fortran90 version and a MATLAB version and an Octave version.
linpack_bench, a Fortran90 code which measures the time needed to factor and solve a linear system.
machine, a Fortran90 code which returns various machine constants.
timer, a Fortran90 code which demonstrates how to compute CPU time or elapsed time.