HP-UX Floating-Point Guide

186 Chapter 7
Performance Tuning
Data Alignment
Data Alignment
The term alignment refers to the type of address that a data object has
in memory. Data objects can have 1-byte, 2-byte, 4-byte, or 8-byte
alignment, meaning that the object is stored at an address evenly
divisible by 1, 2, 4, or 8. In general, the best performance is obtained by
natural alignment, which is the alignment that corresponds to the
length of the object. For example, the natural alignment of an HP C int
is 4-byte alignment.
For simple static variables, the compilers always naturally align data.
The alignment problem occurs in C structures, Pascal records, and
Fortran common blocks. By default, HP-UX compilers align this data
naturally. However, you can specify directives in your program or on the
command line that align data in a way that is compatible with data
alignment on other HP systems. It is also possible to use Fortran
EQUIVALENCE statements or other programming methods to obtain
nondefault data alignment. Specifying nondefault data alignment causes
the compiler to generate extra instructions, which both substantially
increase code size and substantially degrade performance. Moreover,
aligning data on a boundary less than its natural alignment boundary
(for example, aligning a double on a 2-byte boundary) may result in a
bus error or some other kind of run-time error.
In some situations, you can improve performance by aligning data on
greater than natural addresses. This improvement is due to two factors,
both of which concern the vector routines enabled by the +Ovectorize
option:
A single-precision array of numbers will sometimes allow better
performance if it is 8-byte aligned, because the vector routines can
use double-precision load and store operations to move two operands
at a time.
A double-precision array of numbers will sometimes allow better
performance if it is 32-byte, or cache-line, aligned. This is because of
the way the vector routines interact with the data caches on HP 9000
systems.