Task Migration and Fine Grain Parallelism on Distributed Memory Architectures