在 OpenMP 中迴圈並行

schedule 子句的含義如下:

  • static[,chunk]:以迴圈方式靜態分配(意味著在進入迴圈之前完成分發)迴圈迭代以 chunk 大小進行批量處理。如果未指定 chunk,則塊儘可能均勻,並且每個執行緒最多隻能獲得其中一個。
  • dynamic[,chunk]:使用先到先得的策略,按批次的 chunk 大小線上程之間分配迴圈迭代,直到沒有剩餘批處理。如果未指定,則 chunk 設定為 1
  • guided[,chunk]:與 dynamic 一樣,但批量大小越來越小,低至 1
  • auto:讓編譯器和/或執行時庫決定什麼是最合適的
  • runtime:通過 OMP_SCHEDULE 環境變數在執行時決定。如果在執行時未定義環境變數,則將使用預設排程

schedule 的預設值是實現定義。在許多環境中它是 static,但也可以是 dynamic 或者很可能是 auto。因此,請注意,如果沒有明確設定,你的實現不會隱式依賴它。

在上面的例子中,我們使用融合形式 parallel forparallel do。但是,可以使用迴圈結構而不將其與 parallel 指令融合,在 parallel 區域內以 #pragma omp for [...]!$omp do [...] 獨立指令的形式。

僅對於 Fortran 版本,預設情況下,並行迴圈的迴圈索引變數始終為 private。因此,沒有必要明確地宣稱它們為 private(儘管這樣做不是錯誤)。
對於 C 和 C++版本,迴圈索引就像任何其他變數一樣。因此,如果它們的範圍擴充套件到並行化迴圈之外(意味著如果它們不像 for ( int i = ...) 那樣宣告,而是像 int i; ... for ( i = ... ) 那麼它們必須被宣告為 private