Every generation of multicore processors widens the already wide "software gap" between hardware potential and the performance that can be delivered by today's applications. An increasing array of multicore software platforms is becoming available to help narrow this gap, including OpenMP, POSIX threads (Pthreads), Cilk++, MPI, Intel's Threading Building Blocks, Microsoft's Task Parallel Library, to name just a few.
No one-size-fits-all solution exists. The optimal choice must be driven by your unique project's requirements for development time and workflow, application performance, reliability, maintainability, target hardware, etc. To help you sort through some of these factors and determine the best multicore software platform for your unique needs, we have compiled a set of key questions to ask regarding your potential solution.
Development Time
- To multicore-enable my application, how much logical restructuring of my application must I do?
- Can I easily train programmers to use the multicore software platform?
- Can I maintain just one code base, or must I maintain a serial and parallel versions?
- Can I avoid rewriting my application every time a new processor generation increases the core count?
- Can I easily multicore-enable ill-structured and irregular code, or is the multicore software platform limited to data-parallel applications?
- Does the multicore software platform properly support modern programming paradigms, such as objects, templates, and exceptions?
- What does it take to handle global variables in my application?
Application Performance
- How can I tell if my application exhibits enough parallelism to exploit multiple processors?
- Does the multicore software platform address response-time bottlenecks, or just offer more throughput?
- Does application performance scale up linearly as cores are added, or does it quickly reach diminishing returns?
- Is my multicore-enabled code just as fast as my original serial code when run on a single processor?
- Does the multicore software platform's scheduler load-balance irregular applications efficiently to achieve full utilization?
- Will my application "play nicely" with other jobs on the system, or do multiple jobs cause thrashing of resources?
- What tools are available for detecting multicore performance bottlenecks?
Software Reliability
- How much harder is it to debug my multicore-enabled application than to debug my original application?
- Can I use my standard, familiar debugging tools?
- Are there effective debugging tools to identify and localize parallel-programming errors, such as data-race bugs?
- Must I use a parallel debugger even if I make an ordinary serial programming error?
- What changes must I make to my release-engineering processes to ensure that my delivered software is reliable?
- Can I use my existing unit tests and regression tests?