2013-02-28 42 views
2

我想使用tbb管道來並行處理令牌處理。Tbb並行管道對令牌的位置修改

但我不需要在中間過濾器中釋放和重新分配令牌。可以簡單地修改它並返回它嗎?對於爲例我想這樣做:

class MiddleFilter 
{ 
SomeClass* operator() (SomeClass* input) 
{ 
input->somevalue *= 2; 
return input; 
} 
} 

,並呼籲

tbb::parallel_pipeline(nbtoken, someinputfilter 
& tbb::make_filter<SomeClass*, SomeClass*>(tbb::filter::parallel, MiddleFilter()) 
& someoutputfilter) 

SomeClass將被分配在輸入和輸出濾波釋放。

回答

2

是的,允許對傳遞給過濾器的對象進行就地修改,並且在處理昂貴的複製對象時通常很有用。在使用parallel_pipeline並行化Bzip2時,我已經做到了這一點。就TBB而言,您示例中的「輸入」指針只是TBB無意解釋的值。

還有一個竅門,我有時會用它來保存第一個/最後一個過濾器中的分配/釋放。如果第一個和最後一個過濾器是串行過濾器,並且第一個過濾器生成與最後一個過濾器消耗的相同類型的對象,則可以使用循環對象循環來回收對象。緩衝區的大小必須是max_number_of_live_tokens(parallel_pipeline的第一個參數)。第一個過濾器可以通過出隊分配一個對象;最後一個階段可以通過排隊來釋放一個對象。從max_number_of_live_tokens隊列開始。令牌限制保證隊列永遠不會下溢或溢出。

整潔的部分是循環隊列可以使用普通的串行代碼來實現。一個數組和兩個尾部/頭部指針就足夠了。不需要原子操作,鎖定或內存隔離。沒有下溢/溢出的保證意味着可以通過碰撞尾指針(並且幸福地忽略頭指針)來實現入隊操作。反之亦然deque操作。由於呼叫者是串行過濾器,因此不需要鎖定。更糟糕的是,尾部和頭部指針同時被碰撞,但是獨立。 TBB將負責內存屏蔽。

+0

謝謝你的回答和你的提示! – louis 2013-03-02 00:04:50