Example 3.17: Removal of anti dependences.
Example 3.18: Removal of output dependences.
Example 3.19: Removing the flow dependence caused by a reduction.
Example 3.20: Removing flow dependences using induction variable elimination.
Example 3.21: Removing flow dependences using loop skewing.
Example 3.22: A recurrence computation that is difficult to parallelize.
Example 3.23: Parallelization of a loop nest containing a recurrence.
Example 3.24: Parallelization of part of a loop using fissioning.
Example 3.25: Parallelization of part of a loop using scalar expansion and fissioning.
Example 3.26: Avoiding parallel overhead at low trip-counts.
Example 3.27: Reducing parallel overhead through loop interchange.
Example 3.28: Parallel loop with an uneven load.
Chapter 4: Beyond Loop-Level Parallelism—Parallel Regions
Example 4.1: Code that violates restrictions on parallel regions.
Example 4.2: A simple parallel region.
Example 4.3: Replication of work with the parallel region directive.
Example 4.4: Partitioning of work with the parallel do directive.
Example 4.5: Data scoping clauses across lexical and dynamic extents.
Example 4.6: Fixing data scoping through parameters.
Example 4.7: Fixing data scoping using the threadprivate directive.
Example 4.8: Using the copyin clause.
Example 4.9: Implementing a task queue.
Example 4.10: Using the thread number to divide work.
Example 4.11: Dividing loop iterations among threads.
Example 4.12: Using the do work-sharing directive.
Example 4.13: Combining parallel region and work-sharing do.
Example 4.14: Using the sections directive.
Example 4.15: Using the single directive.
Example 4.16: Code that violates the block structure requirement.
Example 4.17: Illustrating the restrictions on work-sharing directives.
Example 4.18: All threads must encounter the same work-sharing contructs.
Example 4.19: Branching out from a work-sharing construct.