C++ OpenMp的並行編程


基於OpenMp的並行編程

功能:並行處理比較耗時的for循環

在OpenMP中,對for循環並行化的任務調度使用schedule子句來實現:

  • 使用格式:schedule(type[,size])

  • type參數表示調度類型:static、dynamic、guided

  • size參數(可選):分配給每個線程的連續迭代計算的次數

    • 靜態調度(static)

      大部分編譯器在沒有使用schedule子句的時候,默認是static調度。static在編譯的時候就已經確定了,那些循環由哪些線程執行。

      當不使用size 時,將給每個線程分配┌N/t┐個迭代。當使用size時,將每次給線程分配size次迭代。

      #pragma omp parallel for schedule(static)
      //#pragma omp parallel for schedule(static,2)
      for (int i = 0; i < 10; ++i)
      {
      printf("i=%d, thread_id=%d\n", i, omp_get_thread_num());
      }

 

  • 動態調度(dynamic)

    動態地將迭代分配到各個線程,動態調度可以使用size參數也可以不使用size參數,不使用size參數時是將迭代逐個地分配到各個線程,使用size參數時,每次分配給線程的迭代次數為指定的size次

    #pragma omp parallel for schedule(dynamic)
    //#pragma omp parallel for schedule(dynamic,2)
    for (int i = 0; i < 10; ++i)
    {
    printf("i=%d, thread_id=%d\n", i, omp_get_thread_num());
    }

     

    從結果看出:這個調度是逐個將任務分配到每一個核心,然后哪個執行完了就接着分配。如果指定size為2,就會每一次為每一個核心連續分配兩個任務

     

  • guided調度(guided)

    guided調度是一種采用指導性的啟發式自調度方法。開始時每個線程會分配到較大的迭代塊,之后分配到的迭代塊會逐漸遞減。迭代塊的大小會按指數級下降到指定的size大小,如果沒有指定size參數,那么迭代塊大小最小會降到1

    #pragma omp parallel for schedule(guided)
    for (int i = 0; i < 10; ++i)
    {
    printf("i=%d, thread_id=%d\n", i, omp_get_thread_num());
    }

     

     

  • 三種運行方式總結:

    靜態調度static:每次哪些循環由那個線程執行時固定的,編譯調試。由於每個線程的任務是固定的,但是可能有的循環任務執行快,有的慢,不能達到最優。

    動態調度dynamic:根據線程的執行快慢,已經完成任務的線程會自動請求新的任務或者任務塊,每次領取的任務塊是固定的。

    啟發式調度guided:每個任務分配的任務是先大后小,指數下降。當有大量任務需要循環時,剛開始為線程分配大量任務,最后任務不多時,給每個線程少量任務,可以達到線程任務均衡。

 

        open MP 與串行執行  對比:

       https://www.cnblogs.com/mfryf/p/6863089.html 

       

       四種調度方式實例: dynamic、guided、runtime、static

       https://blog.csdn.net/billbliss/article/details/44131919

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM