# Introduction to OpenMP

* A parallel programming model, an API
* Comprised of
  * Compiler directives
  * Runtime Library Routines
  * Environment Variables
* Programming Model

![](https://2207252438-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lp-5TQm_JKV6y5SjgAO%2F-Lp-5WXCtzBedVDY02Hj%2F-Lp-5ekTFMMocfFu9uL8%2Fmodel.png?generation=1568738565320559\&alt=media)

* All OpenMP programs begin as a single process: the master thread. The master thread executes sequentially until the first parallel region construct is encountered.
* FORK: the master thread then creates a team of parallel threads.
* JOIN: When the team threads complete the statements in the parallel region construct, they synchronize and terminate, leaving only the master thread.
* Compiler directives statements (start with`#pragma omp`) tell Compiler that here follows a parallel region
  * a parallel region is bounded with`{ }`
* Runtime Library Routines can give you some information about your environment
  * `omp_get_thread_num()`. Tells the thread id of the current thread.
  * `omp_get_num_threads()`. Tells the total thread number. If you don't tell Compiler how many threads you want to have in your program, it will be the number of your cores by default.
  * ... you can find more on the internet about this.
* Environment Variables tell Compiler that some variables are public and some variables are private.
  * As OpenMP is a shared memory model, variables are shared by threads by default.
  * You can define private variables
    * using`private()`statement.
    * ***Notice** that all variables defined in the parallel region are private variables.*
