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() );
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章