TBB之parallel_do

對於一些循環,迭代空間的結束是未知的,或者循環體在循環結束之前可能增加更多的迭代,你能使用模板類tbb::parallel_do處理這2種情況。

鏈表是迭代空間未知的例子,在並行編程中,通常使用動態數組代替鏈表是更好的,因爲訪問鏈表的條目本質是串行的,但是如果你被限制使用鏈表,條目能被安全並行處理,處理每個條目花費至少幾千個指令,你能使用parallel_do增加一些並行度。

例如,考慮下面的串行代碼:

void SerialApplyFooToList( const std::list<Item>& list ) {
    for( std::list<Item>::const_iterator i=list.begin() i!=list.end();
++i )
        Foo(*i);
}

如果Foo花費至少幾千個指令週期運行,那麼你能使用parallel_do來提速,爲了這麼做,你需要定義一個帶const標識的operator()對象:

class ApplyFoo {
public:
    void operator()( Item& item ) const {
        Foo(item);
    }
};

SerialApplyFooToList的並行格式如下:

void ParallelApplyFooToList( const std::list<Item>& list ) {
    parallel_do( list.begin(), list.end(), ApplyFoo() );
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章