[英]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
,您將有兩個競爭條件:
k
的更新期間,即在操作k++
中。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.