The GPU initialization and management is currently scattered around the code base, which complicated adding codes for new platforms (e.g. SYCL). This moves the management code into the hardware subfolder and unifies the function signatures. Also the list of available devices is now stored in a standard container, with the underlying type dependent on the GPU platform used.
This MR supersedes !289 (closed).