  The rise of data-intensive applications exposed the limitations of
conventional processor-centric von-Neumann architectures that struggle to meet
the off-chip memory bandwidth demand. Therefore, recent innovations in computer
architecture advocate compute-in-memory (CIM) and compute-near-memory (CNM),
non-von- Neumann paradigms achieving orders-of-magnitude improvements in
performance and energy consumption. Despite significant technological
breakthroughs in the last few years, the programmability of these systems is
still a serious challenge. Their programming models are too low-level and
specific to particular system implementations. Since such future architectures
are predicted to be highly heterogenous, developing novel compiler abstractions
and frameworks become necessary. To this end, we present CINM (Cinnamon), a
first end-to-end compilation flow that leverages the hierarchal abstractions to
generalize over different CIM and CNM devices and enable device-agnostic and
device-aware optimizations. Cinnamon progressively lowers input programs and
performs optimizations at each level in the lowering pipeline. To show its
efficacy, we evaluate CINM on a set of benchmarks for the well-known UPMEM CNM
system and the memristors-based CIM accelerators. We show that Cinnamon,
supporting multiple hardware targets, generates high-performance code
comparable to or better than state-of-the-art implementations.
