[英]Using openMP with SETS
我希望在OpenMP的幫助下將此代碼#pragma omp parallel for
例如#pragma omp parallel for
以便在不同的線程之間划分工作。
什么是有效的方式? 這里的級別在varioud線程之間共享。
這里是一套。
for(iter=make.at(level).begin();iter!=make.at(level).end();iter++)
{
Function(*iter);
}
如果make.at(level)
返回的類型具有隨機訪問迭代器並具有持續訪問時間,並且如果您的編譯器支持最新的OpenMP版本(讀取:它不是 MSVC ++),那么您可以直接使用parallel for
worksharing指令:
obj = make.at(level);
#pragma omp parallel for
for (iter = obj.begin(); iter != obj.end(); iter++)
{
Function(*iter);
}
如果類型不提供radom-access迭代器,但您的編譯器仍然支持OpenMP 3.0或更高版本,那么您可以使用OpenMP任務:
#pragma omp parallel
{
#pragma omp single
{
obj = make.at(level);
for (iter = obj.begin(); iter != obj.end(); iter++)
{
#pragma omp task
Function(*iter);
}
}
}
這里一個線程執行for循環並創建許多OpenMP任務。 每個任務將使用*iter
的相應值對Function()
進行一次調用。 然后每個空閑線程將從未完成任務列表中開始挑選。 在並行區域的末尾有一個隱式屏障,因此主線程將盡職地等待所有任務完成,然后繼續執行並行區域。
如果你不幸使用MS Visual C ++,那么除了創建一個對象指針數組並使用一個簡單的整數循環迭代它之外,你沒有太多的選擇:
obj = make.at(level);
obj_type* elements = new obj_type*[obj.size()];
for (i = 0, iter = obj.begin(); i < obj.size(); i++)
{
elements[i] = &(*iter++);
}
#pragma omp parallel for
for (i = 0; i < obj.size(); i++)
{
Function(*elements[i]);
}
delete [] elements;
這不是最優雅的解決方案,但應該有效。
編輯:如果我從您的問題標題中正確理解,您正在使用集合。 這排除了第一個算法,因為集合不支持隨機訪問迭代器。 根據編譯器對OpenMP任務的支持,使用第二種或第三種算法。
似乎並行中的變量必須是signed int。 但我不確定。 這是一個關於此的話題。 為什么循環變量必須並行簽名?
要在OpenMP中使用這個迭代器模式,可能需要重新思考如何執行循環 - 你不能使用#pragma omp for
因為你的循環不是一個簡單的整數循環。 我想知道以下是否有效:
iter = make.at(level).begin();
end = make.at(level).end();
#pragma omp parallel private(iter) shared(make,level,end)
{
#pragma omp single
func(iter); /* only one thread does the first item */
while (1)
{
#pragma omp critical
iter = make.at(level).next(); /* each thread gets a different item */
if (iter == end)
break;
func(iter);
}
} /* end parallel block */
請注意,我必須將iter++
更改為關鍵部分中的next()
調用才能使其正常工作。 原因是共享的make.at(level)
對象需要記住哪些項已經被處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.