[英]Sharing information via (c++) openmp between different threads
我對並行編程比較陌生,並且想通過openmp在c ++中完成以下任務。
我有一些(讓我們說4)相對復雜的對象/計算要做。 它們都是相似的,但是太復雜而無法並行化它們(因此它們以串行方式運行)。 因此,我的想法是為每個線程/線程使用不同的線程/ cpu,這意味着我想將計算分散到內核中。 盡管在這種情況下這可能不是並行處理的最有效用法,但它可能是最容易實現的(因為每個計算的復雜性都很高)。
雖然這可以通過
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < 4; i++)
{
obj[i].calculate();
}
}
我想在這些對象之間交換更多信息,例如,在每次計算期間都應修改一個整數(或更復雜的對象)“ a”(盡管我無法預測何時和多久一次,但尤其是多於一次)。 如果對其進行了修改,則信息也需要相互合並。 盡管信息的特定交換(再次)相對復雜,但這也通過“計算”方法(隱式)完成。 通常,它應與上面類似,帶有附加的整數“ a”,所有計算方法都將其寫入和從中讀取:
int a;
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < 4; i++)
{
obj[i].calculate();
}
}
所以我的問題是,如何防止“ a”上的“數據競賽”? 意味着如何生成一個對象,該對象每次只能由一個線程訪問,而無需在“計算”方法本身中進行詳細介紹? openmp是否提供此功能,如果不提供,哪個庫提供?
最好的問候,並在此先感謝!
從你的描述來看,我不知道並行執行是否會幫助你在所有的時候每個線程必須等待更新的信息a
。
無論如何,您可以使用flush
, atomic
和critical
指令更新不帶競爭條件的變量。 最佳選擇在很大程度上取決於哪些線程必須更新a
或獲取更新a
。
critical
:所有線程都執行代碼,但每個線程一次執行
atomic
:內存可防止多次寫入,並在內部由critical
替換
flush
:更新共享變量,並由critical
隱式調用
最后, barrier
確保所有線程在代碼中到達同一點。
我想在這些對象之間交換更多信息,例如,在每次計算期間都應修改一個整數(或更復雜的對象)“ a”(盡管我無法預測何時和多久一次,但尤其是多於一次)。
該語句有點惱人,因為您應該知道何時需要更新a
。 這樣做時,您需要在所有線程中設置屏障,在關鍵部分中更新a
並繼續並行執行。 那么有多少個線程更新a
? 是主線程還是全部?
如果只有一個線程來更新a
,那么另一個選擇是single
指令。 它的代碼僅由具有隱式屏障和執行后隱式刷新的一個線程執行。 這些是適當的更新復雜的對象一般選擇a
對所有線程。 祝好運。
當然,您意識到, calculate
方法無法訪問您發布的代碼中的變量a
。 如果您想像這樣工作,可以在修改a
時內聯編寫計算函數並使用關鍵部分:
int a;
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < 4; i++)
{
// code of calculate
#pragma omp critical
{
// modify a
}
// other code
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.