Task-Based Parallelism For General Purpose Graphics Processing Units And Hybrid Shared-Distributed Memory Systems