Workload Driven Designs for Cost-Effective Non-Volatile Memory Hierarchies