An alternative approach involves the utilisation of architecture-independent -and typically more abstract -programming models, which come in various forms. One category employs compiler directives to manage loop parallelization and data management. Examples include OpenMP and OpenACC . Programming with these directives aims at a single codebase compatible with different accelerators. Directive-based approaches can also facilitate the reuse of existing CPU-based code and enable an incremental code-porting workflow by successively "offloading" performance-critical parts of the code. Success-stories have been observed adapting these models .