簡體   English   中英

OpenMP 子句共享與關鍵

[英]OpenMP clause shared vs critical

我在多個線程上執行了一個循環。 每個循環都會將一個值存儲到一個全局向量中。 所有線程都使用向量索引變量,每個線程在向量更新后遞增索引。 必須保護對索引的訪問。 OpenMP 中是如何進行保護的?

1/ 如果我指定 #pragma omp parallel shared(k) 這會保護(同步訪問)跨線程的 k-index 訪問嗎?

   int k = 0;
   #pragma omp parallel shared(k)
   for (int i = 1; i < d; ++i)
   {
      for (int j = 0; j < i; ++j)
      {
         my_vec[k++] = some_value; //no need to protect my_vector, if k is unique across trheads
      }
   }

2/我需要使用臨界區嗎

   int k = 0;
   #pragma omp parallel
   for (int i = 1; i < d; ++i)
   {
      for (int j = 0; j < i; ++j)
      {
        #pragma omp critical (section_name)
        {
           my_vec[k++] = some_value;
        }
      }
   }

3/我需要同時使用共享子句和臨界區塊嗎?

1/ 如果我指定 #pragma omp parallel shared(k) 這會保護(同步訪問)跨線程的 k-index 訪問嗎?

如果您使用共享k ,您將有兩個競爭條件

  1. 在變量k的更新期間,即在操作k++中。
  2. 在操作期間訪問數組my_vec期間my_vec[k++] = some_value;

具有相同k索引的多個線程可以相互重寫my_vec[k]的值。

AFAIK 沒有條件使變量 shared 可以避免競爭條件 通常情況正好相反。 如果您共享一個變量,您可能需要確保它受到保護以防止並發線程更新。

2/我需要使用臨界區嗎

如果您只使用臨界區並且變量k在線程中是私有的,那么在訪問數組my_vec期間(在操作my_vec[k++] = some_value;期間),您將遇到競爭條件 盡管如此,如果沒有另外指定(例如private(k) ),默認情況下 OpenMP 假定變量k在線程之間共享。 因此,使用臨界區足以確保對兩個共享變量(變量k和數組my_vec )的訪問互斥

3/我需要同時使用共享子句和臨界區塊嗎?

您可以明確表示變量k是共享的,但默認情況下,選項 2) 就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM