高性能計算--OpenMP

OpenMP簡介

  OpenMP應該是歷史比較悠久的並行工具吧,至少我最早知道的是它,做爲共享存儲標準,它是爲多處理器多核心的設備上編寫並行程序而設計的一個應用編程接口,包括一套編譯知道語言和一個支持它的函數庫。
  上述都是比較官方的話語,對我而言,它有兩個優勢:其一爲可結合標準的C/C++(外加Fortran)進行工做,而且基本應用較爲簡單,易於學習(僅限於皮毛);其二爲支持跨平臺,VS中可經過編輯屬性直接開啓此功能,Linux只要包含頭文件就能夠了,支持gcc,g++編譯器,這也就下降了安裝配置的難度。編程

OpenMP編譯指導語句

  簡單介紹下OpenMP編譯指導語句:函數

  • parallel 用在代碼段前,指示該代碼可被多個線程並行執行
  • for 用在C/C++標準的for循環以前,可是每一個循環之間必須是無相關性的,這樣才能夠分配到每一個線程中執行
  • parallel for 字面意思parallel + for的組合
  • sections 用在代碼段以前,該代碼段可能會被並行執行
  • parallel sections 顧名思義parallel + sections的組合
  • critical 用在代碼臨界區以前(還沒用過)
  • single 若代碼段只能被單個線程執行,則用此語句

除此以外,還有幾個比較關鍵的函數:工具

  • omp_get_num_procs 返回處理器的個數
  • omp_get_num_threads 返回線程個數
  • omp_get_thread_num 返回線程索引號
  • omp_set_num_threads 指定線程個數

工做模式

  OpenMP中,標準的並行模式爲fork/join模式,簡單將就是隻有一個主線程(通常是按照串行執行的),當須要並行執行時,就會派生(fork)出多個線程,此時,主線程與這些派生線程協同工做,在並行代碼段執行結束是,派生的線程掛起,控制流從新回到(join)主線程中,知道完成整個程序。(晚些時候會附個圖說明)學習

語言簡介

parallel for

  從如今的應用看,這個組合佔了半壁江山,因此仍是須要好好看看的,先上個示例代碼:線程

#單層for循環更改
int b[300]
#pragma omp parallel for
    for(int i = 0; i < 300; i++)
        b[i] = i;

上述代碼即完成了此for循環的並行化,比較簡單,也比較經常使用,但有時候也會出現用到雙重循環,這就須要進化下代碼了:設計

#雙重循環
#pragma omp parallel for private(j)
    for(int i = 0; i < 100; i++)
        for(int j = 0; j < n; j++)
            a[i][j] = j;

雙重循環就有點難度了,須要講解下, parallel for 不用解釋了, private 聲明私有變量,保證 j 的獨立性,使其餘線程沒法訪問此該變量。code

功能並行

  parallel for及其附屬佔了半壁江山,那剩下的半壁江山就是即將介紹的:parallel sections,該方法是爲了實現功能並行,簡單講就是你能夠分配線程a實現功能A,線程b實現功能B......待所有完成後,再統一回到主線程中:索引

#代碼塊功能並行
#pragma omp parallel sections
{
#pragma omp section
    {
        a = A;
    }
#pragma omp section
    {
        b = B;
    }
}

其中,#pragma omp section中執行具備獨立功能的代碼塊,方便靈活使用。接口

相關文章
相關標籤/搜索