Parallelizing existing sequential applications is often considered to be a complicated and challenging task. It requires thorough knowledge about both, the application to parallelize and the development system to work with. Within BAP, we try to simplify this task as much as possible while preserving efficiency of the resulting program.
The way we try to achieve this goal is to provide the user with a set of tools, that cover different levels of parallelization: On the one hand we provide a predicate like farm() that simply takes a set of tasks (Prolog goals) and automaticly executes them in parallel. On the other hand we provide low-level message passing routines that give the user the most freedom in designing his own communication paradigms. In between several 'mid-level' routines provide a communication scheme known as 'client-server', that is characterized by good efficiency and highly intuitive semantics.
This approach allows the programmer to enter the 'parallel world' step by step. With increasing knowledge of the parallelization techniques, he can optimize his solutions. He may trade in his learning time against system performance.