Does HPX expose an interface for users to write their own application-specific load balancing strategies? Or such load balance policies need to be entangled with the application logic?
HPX has an API that allows to 'migrate' HPX components (i.e. C++ objects that are managed through a global adress) to a different locality: hpx::components::migrate(what, where_to);
.
The library also exposes a long list of predefined performance counters that can be used to introspect various metrics usable to make decisions on what to move where and when. It also possible to create user-defined performance counters accessible through the same API.
There is no infrastructure to write your own strategies for load-balancing, though.
Related with 1), does users have control over the scheduling policy (when and where to run tasks)?
Yes.
How programmable are they? Do users have full control, or only can choose from several built-in ones?
It's fairly flexible to control this.
Does HPX expose a way to model and let users change the layout of arrays in memory? E.g., row-major or column-major.
No. This is enirely up to the data structures you want to use. HPX is a C++ libraryand integrates well with any other C++ code you might want to utilize.