Many-core and heterogeneous architectures: programming models and compilation toolchains