Parallel Programming with OpenMP

Introduction

This project explores the use of OpenMP for parallel programming in C/C++ via the Intro to OpenMP tutorial by Tim Mattson, Intel Corp.

  • Watch the course video.
  • Read the course notes.
  • Do the exercise files.
  • A useful OpenMP 3.1 API C/C++ syntax quick reference card.

We provide the code solutions to OpenMP coding exercises in C/C++. All of our code is built using CMake and is containerized using Dockers.

The following tools will be used in this project:

  • C/C++
  • OpenMP
  • Docker

Learning Outcome

Find the source code in the repository.

At the end of this project, we should be able to:

  • Use OpenMP in C/C++ for parallel programming in shared memory applications.
  • Build C/C++ code with CMake and run it in a Docker container.

Project Structure

The project structure is as follows:

OpenMP-Tim-Mattson                   # Repository root
├── apps                             # Executables for each exercises
|   ├── CMakeLists.txt               # CMake build for executables
|   ├── linked.c                     
|   ├── mandel.c
|   ├── pi_mc.c
|   ├── prodCons.c           
|   └── tutorial.c                   
├── assets                           # Assets
|   ├── Intro_To_OpenMP_Mattson.pdf  # Tutorial slides
|   └── OpenMP3.1-CCard.pdf          # OpenMP reference card
├── libs                             # Local libraries
│   ├── computepi                     
|   │   ├── CMakeLists.txt           # Library-level CMake build file
|   │   ├── computepi.cpp            # Source file
|   │   └── computepi.h              # Header file
│   ├── helloworld                    
|   │   ├── CMakeLists.txt           # Library-level CMake build file
|   │   ├── helloworld.cpp           # Source file
|   │   └── helloworld.h             # Header file
│   └── random                       
|       ├── CMakeLists.txt           # Library-level CMake build file
|       ├── random.c                 # Source file
|       └── random.h                 # Header file
├── .dockerignore
├── .gitignore
├── CMakeLists.txt                   # Top-level CMake build file
├── docker-compose.yml               # Docker deployment
├── dockerfile                       # To create Docker container
└── README.md                                 

List of exercises

For easy reference, each solution code is named according to the slide on which they appear in the course notes. Instructions to build, setup commands, and to run the solutions for each exercise is given in the following table.

Exercise Instructions to run
Slide 38 - Parallel 'Hello World' program 1) File: `/apps/tutorial.cpp`
2) Build: `docker build -t openmp .` on `Dockerfile`
3) Set: `command: /src/bin/tutorial` in `docker-compose.yaml` file
4) Run: `docker-compose up` on `docker-compose.yaml` file
Slide 48 - Compute $\pi$ in serial
Slide 52 - Compute $\pi$ in parallel with false sharing
Slide 57 - Compute $\pi$ in parallel with padding
Slide 69 - Compute $\pi$ in parallel with synchronization
Slide 88 - Compute $\pi$ with WorkSharing
Slide 119 - Mandel Brot 1) File: `/apps/mandel.c`
2) Build: `docker build -t openmp .` on `Dockerfile`
3) Set: `command: /src/bin/mandel` in `docker-compose.yaml` file
4) Run: `docker-compose up` on `docker-compose.yaml` file
Slide 124 - Linked list computed serially 1) File: `/apps/linked.c`
2) Build: `docker build -t openmp .` on `Dockerfile`
3) Set: `command: /src/bin/linked` in `docker-compose.yaml` file
4) Run: `docker-compose up` on `docker-compose.yaml` file
Slide 128 - Linked list in parallel without Tasks
Slide 143 - Linked list in parallel with Tasks
Slide 166 - Producer Consumer 1) File: `/apps/prodCons.c`
2) Build: `docker build -t openmp .` on `Dockerfile`
3) Set: `command: /src/bin/prodCons` in `docker-compose.yaml` file
4) Run: `docker-compose up` on `docker-compose.yaml` file
Slide 177 - Parallel Monte Carlo computation of $\pi$ 1) File: `/apps/pi_mc.c`
2) Build: `docker build -t openmp .` on `Dockerfile`
3) Set: `command: /src/bin/pi_mc` in `docker-compose.yaml` file
4) Run: `docker-compose up` on `docker-compose.yaml` file
Slide 181 - Thread safe random number generator
Slide 185 - Leap frog method to avoid overlapped random number sequence

Updated:

Leave a comment