有人告诉我enumerable_thread_specific将提高thrad的性能,但我不明白为什么。使用英特尔线程构建模块(TBB)库中的enumerable_thread_specific有什么好处?

文档(link)的动机有点模糊,但似乎表明其目的是在您不提前知道线程数的情况下(如链接中的TBB文档示例所示)在列表中延迟创建项目:

#include <cstdio>
#include <utility>

#include "tbb/task_scheduler_init.h"
#include "tbb/enumerable_thread_specific.h"
#include "tbb/parallel_for.h"
#include "tbb/blocked_range.h"

using namespace tbb;

typedef enumerable_thread_specific< std::pair<int,int> > CounterType;
CounterType MyCounters (std::make_pair(0,0));

struct Body {
     void operator()(const tbb::blocked_range<int> &r) const {
          CounterType::reference my_counter = MyCounters.local();
          ++my_counter.first;
          for (int i = r.begin(); i != r.end(); ++i)
              ++my_counter.second;
     }
};

int main() {
     parallel_for( blocked_range<int>(0, 100000000), Body());

     for (CounterType::const_iterator i = MyCounters.begin();
         i != MyCounters.end(); ++i)
     {
            printf("Thread stats:\n");
            printf("     calls to operator(): %d", i->first);
            printf("     total # of iterations executed: %d\n\n",
                 i->second);
    }
}

这真的必要吗?还有其他好处没有列出吗?有人指出跨线程访问内存可能有优势,但是我不清楚这是怎么发生的?

最佳答案

enumerable_thread_specific的想法是提供一个围绕TLSthread_local in C++11概念的容器,以便一个线程分配的值以后可以在另一个线程中组合/枚举。真正有助于提高性能的是上述概念的共同特性。

通常,TLS允许避免在处理器高速缓存或互斥锁的线程之间争用,否则对于共享全局对象将发生互斥。有关类似容器combinable<>的更多详细信息和说明,请参见this blog,该容器在TBB中也可用。

关于c++ - TBB中的TLS enumerable_thread_specific,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26986037/

10-13 08:15