[英]Parallel OpenMP loop with break statement
我知道你不能有一個OpenMP循環的break語句,但我想知道是否有任何解決方法,同時仍然受益於並行性。 基本上我有'for'循環,循環遍歷大向量的元素,尋找滿足某個條件的一個元素。 但是只有一個元素可以滿足條件,所以一旦發現我們可以突破循環,提前謝謝
for(int i = 0; i <= 100000; ++i)
{
if(element[i] ...)
{
....
break;
}
}
看到這個片段:
volatile bool flag=false;
#pragma omp parallel for shared(flag)
for(int i=0; i<=100000; ++i)
{
if(flag) continue;
if(element[i] ...)
{
...
flag=true;
}
}
這種情況更適合pthread。
您可以嘗試使用while循環手動執行openmp for循環:
const int N = 100000;
std::atomic<bool> go(true);
uint give = 0;
#pragma omp parallel
{
uint i, stop;
#pragma omp critical
{
i = give;
give += N/omp_get_num_threads();
stop = give;
if(omp_get_thread_num() == omp_get_num_threads()-1)
stop = N;
}
while(i < stop && go)
{
...
if(element[i]...)
{
go = false;
}
i++;
}
}
這樣你就必須在每個周期測試“走”,但這不應該那么重要。 更重要的是,這將對應於循環的“靜態”omp,這僅在您可以預期所有迭代花費相似的時間量時才有用。 否則,3個線程可能已經完成,而其中一個仍然有一半...
我可能會做(從yyfn復制一下)
volatile bool flag=false;
for(int j=0; j<=100 && !flag; ++j) {
int base = 1000*j;
#pragma omp parallel for shared(flag)
for(int i = 0; i <= 1000; ++i)
{
if(flag) continue;
if(element[i+base] ...)
{
....
flag=true;
}
}
}
bool foundCondition = false;
#pragma omp parallel for
for(int i = 0; i <= 100000; i++)
{
// We can't break out of a parallel for loop, so this is the next best thing.
if (foundCondition == false && satisfiesComplicatedCondition(element[i]))
{
// This is definitely needed if more than one element could satisfy the
// condition and you are looking for the first one. Probably still a
// good idea even if there can only be one.
#pragma omp critical
{
// do something, store element[i], or whatever you need to do here
....
foundCondition = true;
}
}
}
這是一個更簡單的接受答案的版本。
int ielement = -1;
#pragma omp parallel
{
int i = omp_get_thread_num()*n/omp_get_num_threads();
int stop = (omp_get_thread_num()+1)*n/omp_get_num_threads();
for(;i <stop && ielement<0; ++i){
if(element[i]) {
ielement = i;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.