2011-11-09 46 views
1

我有一個關於並行循環中的局部值和更新全局變量的問題。TBB:局部和全局結果parallel_for

例如,在僞代碼中:我在一個很長的向量中搜索最大值。我可以做一個循環,這樣的:

int max; 
for(i ...) { 
    if (max < vector[i]) max = vector[i]; 
} 

我可以很容易地使用OpenMP並行化:

int max; 
#pragma omp parallel 
{ 
    int local_max; 
#pragma omp parallel for 
    for(i ...) { 
     if (local_max < vector[i]) local_max = vector[i]; 
    } 

#pragma omp critical 
    { 
     // choose the best solution from all 
     if (max < local_max) max = local_max; local_max 
    } 
} 

我如何可以做同樣的TBB parallel_for?我不要求精確的代碼,我想只是知道如何在循環,而不是在每次迭代結束時更新全局結果...

(我是新來的TBB)

回答

1

你在這個例子中做了什麼叫做還原,所以使用parallel_reduce。它應該比鎖定下更新全局變量更有效。基本思想是,local_maxparallel_reduce的主體類的成員變量,其方法接收正文的另一個實例,並將local_max更新爲當前值和另一實例中的值中較大的一個。然後在調用parallel_reduce之後,您將local_max值從原始主體對象中取出,並將其分配給全局變量。

+0

謝謝,這正是我需要的! –