The Dream Team
Part of the planning phase should be an evaluation of the skills of project team members. It's important to have familiarity with parallel programming throughout the team, from those responsible for the initial design to those providing field support.
In the ideal case, a "dream team" would deliver applications that delight the user with new functionality, scale up to the number of cores on the newest processors, all on schedule with market availability. In building that dream team, you'll get better results teaching an engineer with domain knowledge the principles of parallelism than training a computer scientist in what your users expect. Work toward a team with these skills:
- Parallelism Architect: Needs expertise in parallelism, with experience in parallel algorithm design, and deep knowledge of your application. Grow one of your application experts through classroom training on principles, best practices, and tools.
- Computational Scientist: An individual that combines scientific domain knowledge with parallel-computing expertise. Bring in one of this new breed to discover how the latest parallel methods and structures can increase your functional and performance advantage.
- Application Developers: Developers should be trained in the principles of parallel processing, know parallel tools, and be able to build thread-safe component interfaces.
- Test Engineers: Test engineers should be quite strong in parallel debugging skills and familiar with parallel analysis and profiling tools. Key adversarial testing skills in parallelism vary not only the number of threads, but the order in which they execute.
- Field Support Engineers: These engineers need some parallel debugging skills and should also have knowledge of parallel tools. In highly scalable software, your customer may have a larger cluster than you can afford at headquarters. Field engineers need parallel application skills to work with these customers.
Of course, reality rarely reflects the ideal case, but the critical point here is that all team members need to have experience with parallel computing.
Grow three types of knowledge: knowledge of what your users want in each function, horizontal knowledge of the architecture in clean synchronizing interfaces, and vertical knowledge in building and using thread-safe components. Don't have a developer that's added parallelism in one function move on to adding parallelism in another. The function's developer knows the code best and will have the best intuition on what is and what is not parallel.
Finally, whether you're developing an HPC application or productivity software, the fundamental things apply: Target some features where you can add parallelism today. Think strategically about parallelism in the whole application. And develop parallel skills in every member of the development team. In the next installment of this series, we'll move beyond the planning phase and explore the management issues surrounding implementation, test, and debug of parallel HPC systems.
Steve Apiki is senior developer at Appropriate Solutions, Inc., a Peterborough, NH consulting firm that builds server-based software solutions for a wide variety of platforms using an equally wide variety of tools. Steve has been writing about software and technology for over 15 years.