Optimum: Thermal-aware task allocation for heterogeneous many-core devices