The efforts in respect to hardware-software co-design are manifold. They include e.g. the definition of suitable APIs for the programming model or the I/O and resiliency layers. They are designed to support the new HW features and make them easily usable for the application developers.
Quite naturally, software requirements also heavily influence the hardware design and the selection of the right hardware components, for instance the size of the non-volatile memory (NVM) devices, the size of the storage or the network topology.