Developing and maintaining parallel programs is hard. One reason is that applications express both computations and orderings among the computations. Some orderings are dependences required by the semantics. Some are for tuning for a specific goal and platform. Some are purely arbitrary. To modify the application as it evolves, the required orderings must be identified and maintained. If this process is too conservative and views unnecessary orderings as required, we might loose performance. If it is too aggressive and views necessary orderings as arbitrary, we might get erroneous results. Furthermore this repeated process reduces productivity both because it takes time and also because is error prone.
CnC improves both productivity and performance by isolating the description of the meaning of the application, called the domain spec, from anything to do with the tuning process. The domain expert in, for example, physics, medicine, or economics, creates the domain spec of the application including required orderings among computations but with no arbitrary or tuning orderings. This spec is maximally reusable, maximally analyzable for any optimizer, and maximally flexible with respect to tuning. Tuning includes platform dependent optimizations and runtimes. The tuning expert, often a computer scientist, starts with the domain specification and tunes it for a specific target platform and specific tuning goals. These goals might be, for example, to minimize time to execute or minimize power/energy consumption. The specification of the app and its tuning are disjoint activities even if one person acts as both the domain expert and the tuning expert.
CnC is not a parallel programming model. There is no thinking about parallelism involved. But it isn’t a serial model either. There are no arbitrary serial orderings. We refer CnC programming as dependence programming. The CnC domain spec is very close to a white board drawing. This is evidence that it is close to how we think about applications. It is also close to a classic dependence graph, a common intermediate form for optimizing compilers supporting a wide range of optimizations and of platforms. In fact, we have implemented a variety of optimizations and of execution styles.
The talk will introduce the CnC concepts, show a variety of implemented tuning approaches, describe the current state and our future plans.