  Memory approximation techniques are commonly limited in scope, targeting
individual levels of the memory hierarchy. Existing approximation techniques
for a full memory hierarchy determine optimal configurations at design-time
provided a goal and application. Such policies are rigid: they cannot adapt to
unknown workloads and must be redesigned for different memory configurations
and technologies. We propose AXES: the first self-optimizing runtime manager
for coordinating configurable approximation knobs across all levels of the
memory hierarchy. AXES continuously updates and optimizes its approximation
management policy throughout runtime for diverse workloads. AXES optimizes the
approximate memory configuration to minimize power consumption without
compromising the quality threshold specified by application developers. AXES
can (1) learn a policy at runtime to manage variable application quality of
service (QoS) constraints, (2) automatically optimize for a target metric
within those constraints, and (3) coordinate runtime decisions for
interdependent knobs and subsystems. We demonstrate AXES' ability to
efficiently provide functions 1-3 on a RISC-V Linux platform with approximate
memory segments in the on-chip cache and main memory. We demonstrate AXES'
ability to save up to 37% energy in the memory subsystem without any
design-time overhead. We show AXES' ability to reduce QoS violations by 75%
with $<5\%$ additional energy.
