  Digital processing-in-memory (PIM) architectures mitigate the memory wall
problem by facilitating parallel bitwise operations directly within memory.
Recent works have demonstrated their algorithmic potential for accelerating
data-intensive applications; however, there remains a significant gap in the
programming model and microarchitectural design. This is further exacerbated by
the emerging model of partitions, which significantly complicates control and
periphery. Therefore, inspired by NVIDIA CUDA, this paper provides an
end-to-end architectural integration of digital memristive PIM from an abstract
high-level C++ programming interface for vector operations to the low-level
microarchitecture.
  We begin by proposing an efficient microarchitecture and instruction set
architecture (ISA) that bridge the gap between the low-level control periphery
and an abstraction of PIM parallelism into warps and threads. We subsequently
propose a PIM compilation library that converts high-level C++ to ISA
instructions, and a PIM driver that translates ISA instructions into PIM
micro-operations. This drastically simplifies the development of PIM
applications and enables PIM integration within larger existing C++ CPU/GPU
programs for heterogeneous computing with significant ease.
  Lastly, we present an efficient GPU-accelerated simulator for the proposed
PIM microarchitecture. Although slower than a theoretical PIM chip, this
simulator provides an accessible platform for developers to start executing and
debugging PIM algorithms. To validate our approach, we implement
state-of-the-art matrix operations and FFT PIM-based algorithms as case
studies. These examples demonstrate drastically simplified development without
compromising performance, showing the potential and significance of CUDA-PIM.
