Braunl’s book is divided into four parts: an introduction, discussing the fundamental concepts of parallel programming; followed by two sections, one dealing with asynchronous parallelism, the other with synchronous parallelism; and finally a section dealing other parallel programming models. As may be deduced from the above, the author addresses parallel programming from the viewpoints of asynchronous and synchronous parallelism, based on Flynn’s MIMD and SIMD models, respectively, and builds on the concepts covered in the introductory part.
Part I (Chapters 1‐5) of the book contains a distillation of standard parallel programming material. It covers, for example, the need for parallel program solutions and Flynn’s classification of computer architectural models. Additionally, this first part contains a description of Petri nets (as an example method for defining asynchronous parallel tasks); various parallel processing concepts such as coroutines, forks and joins; and several parallel processor network topologies.
Part II (Chapters 6‐10) of the book examines asynchronous parallelism and covers such topics as the structure of an MIMD system; synchronization and communication in MIMD systems; common problems (such as inconsistent data, deadlocks and level balancing) occurring in MIMD systems; MIMD programming languages (including specification languages such as CSP, as well as programming languages, e.g. Concurrent Pascal, occam and Modula‐P); and, finally, coarse‐grained parallel algorithms.
Part III (Chapters 11‐15) explores synchronous parallelism and has a similar format to Part II. Thus, the author deals with the structure of SIMD systems; communication in SIMD systems; particular problems encountered in SIMD systems; and SIMD programming languages such as Fortran 90, C* and Parallaxis (the author’s own development). This third part concludes with a chapter on massively parallel algorithms, with sketched examples ranging from numerical integration to the generation of fractals.
Finally, Part IV (Chapters 16‐18) contains chapters on automatic parallelization and vectorization; non‐procedural parallel programming languages; and performance analysis of parallel systems. The first of these chapters gives some insight into automatic parallelization via formalisms for data dependence relations; and vectorization in terms loop parallelization. The performance chapter briefly examines issues such as speed‐up and scale‐up, with MIMD and SIMD differences being highlighted.
The stated aim of the book is to provide “an introduction to the subject of parallel programming”. In this, the author succeeds, although, as I read the various chapters, there were a number of occasions when I wished for more depth and detail. In this reviewer’s opinion, the emphasis of this book must be on “introduction”. But this is clearly stated in the title, and does not detract from the usefulness of the book. The author has provided Internet access to Modula‐P and Parallaxis compilers and sample programs; and a Petri net simulation system. In a limited space, the author gives a broad overview of a number of parallel programming languages, plus useful programming examples. The style of writing is easy to follow, and the explanations and diagrams are clear. Anyone with a general understanding of computing would be able to cope with this book. In summary, this is a good book for someone who wants a basic introduction to parallel processing. Perhaps in a later edition, the author will add more “meat to the skeleton”?
