在 OpenMP 中迴圈並行
schedule
子句的含義如下:
static[,chunk]
:以迴圈方式靜態分配(意味著在進入迴圈之前完成分發)迴圈迭代以chunk
大小進行批量處理。如果未指定chunk
,則塊儘可能均勻,並且每個執行緒最多隻能獲得其中一個。dynamic[,chunk]
:使用先到先得的策略,按批次的chunk
大小線上程之間分配迴圈迭代,直到沒有剩餘批處理。如果未指定,則chunk
設定為 1guided[,chunk]
:與dynamic
一樣,但批量大小越來越小,低至 1auto
:讓編譯器和/或執行時庫決定什麼是最合適的runtime
:通過OMP_SCHEDULE
環境變數在執行時決定。如果在執行時未定義環境變數,則將使用預設排程
schedule
的預設值是實現定義。在許多環境中它是 static
,但也可以是 dynamic
或者很可能是 auto
。因此,請注意,如果沒有明確設定,你的實現不會隱式依賴它。
在上面的例子中,我們使用融合形式 parallel for
或 parallel do
。但是,可以使用迴圈結構而不將其與 parallel
指令融合,在 parallel
區域內以 #pragma omp for [...]
或 !$omp do [...]
獨立指令的形式。
僅對於 Fortran 版本,預設情況下,並行迴圈的迴圈索引變數始終為 private
。因此,沒有必要明確地宣稱它們為 private
(儘管這樣做不是錯誤)。
對於 C 和 C++版本,迴圈索引就像任何其他變數一樣。因此,如果它們的範圍擴充套件到並行化迴圈之外(意味著如果它們不像 for ( int i = ...)
那樣宣告,而是像 int i; ... for ( i = ... )
那麼它們必須被宣告為 private
。