OpenMP(Open Multi-Processing)是一組編譯指示和一個API給使用C、C++或FORTRAN寫的程式用。它提供共用記憶體環境下的平行程式支援。OpenMP會辨認平行區端(parallel region)為可以平行執行的程式碼區段。
OpenMP例子:openmp.c
/**
* Example of openmp parallel region
*
* To compile, enter:
*
* gcc -fopenmp openmp.c
*
* You should see the message "I am a parallel region" for each
* processing core on your system.
*
* For those using a virtual machine, make sure you set the number of
* processing cores > 1 to see parallel execution of the parallel region.
*/
#include <omp.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
/* sequential code */
#pragma omp parallel
{
printf("I am a parallel region\n");
}
/* sequential code */
return 0;
}
當OpenMP遇到編譯指示
#pragma omp parallel
它會產生和系統處理核心一樣多的執行緒,然後所有的執行緒同時執行平行區塊,當每一個執行緒離開平行區塊,程式就結束。
Terminal
編譯並執行
gcc -fopenmp openmp.c
./a.out
結果:(雙核心系統,#pragma omp parallel 產生兩個執行緒)
Thread(s) per core(每核心的執行緒數)
這表示每個核心可以同時執行的執行緒數量。許多現代 CPU 支援超執行緒技術(如 Intel 的 Hyper-Threading),使得每個核心能同時處理兩個執行緒。若此值為 1,則表示每個核心只能處理一個執行緒。
Core(s) per socket(每插槽的核心數)
這表示每個 CPU 插槽中有多少個物理核心。若此值為 2,則表示在該插槽中有兩個物理核心。這意味著該 CPU 可以同時處理多個獨立的任務,因為每個核心都是獨立的執行單元。
參考:greggagne/OSC9e/ch4/openmp.c