A Formal Approach to Memory Access Optimization: Data Layout, Reorganization, and Near-Data Processing