With the increasing hardware diversity comes an increasing need for software adaptation and significant re-engineering, or in some cases the need to rewrite code from scratch. Since the effort required is significant and the resources are limited, it is of primary importance to facilitate the re-use of codes and libraries. At the same time, this will also improve portability of codes across multiple, different architectures.
For example, we already know that the exascale system deployed in the US will include at least three different heterogeneous application programming frameworks, while yet another solution based on an HPC accelerated processor will be selected for the Japanese exascale system. As a consequence, it is important for codes to be written and engineered with modularity in mind, with self-contained modules possibly featuring standardized APIs. In this way, codes can better implement the separation of concerns approach, required to exploit very different architectures (homogeneous and heterogeneous). This is even more critical since there is no unified approach at the moment for exascale programming models. This separation of concerns is key to meet the requirement of being simultaneously able to make rapid progress in scientific (model) development, and agile adaptation to the most efficient infrastructure.
In this way it is possible to preserve the enormous value contained in the European scientific and technical code base, and make codes ready also for new user needs and models, where more than one code or code module are combined together in complex workflows, which can exploit the HPC systems in very different ways: scaling out, scaling up, interactively, with ensemble runs and high throughput.