Design Patterns for Parallel Programming