There are at least two sides to every heterogeneous system
Abstract
Since there are at least two sides to every heterogeneous system, optimizing for heterogeneous systems is inherently an exercise in manag-ing complexity, balanced trade-offs and layering. Efforts to make the hardware simple may result in software complexity, unless there's an abstracting software layer involved. Different customer-driven usage models make it challenging to offer a layered but consistent pro-gramming model, a cost-effective set of performance features and a flexibly-capable systems software stack. And often, the very reasons why heterogeneous systems exist drives them to change over time, making them difficult to target from a code generation perspective.