TBB task_arena & task_group usage for scaling parallel_for work
我正在尝试使用 Threaded Building Blocks task_arena。有一个充满"0"的简单数组。 Arena 的线程将"1"放入数组中的奇数位置。主线程将'2'放在偶数位置的数组中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | /* Odd-even arenas tbb test */ #include <tbb/parallel_for.h> #include <tbb/blocked_range.h> #include <tbb/task_arena.h> #include <tbb/task_group.h> #include <iostream> using namespace std; const int SIZE = 100; int main() { tbb::task_arena limited(1); // no more than 1 thread in this arena tbb::task_group tg; int myArray[SIZE] = {0}; //! Main thread create another thread, then immediately returns limited.enqueue([&]{ //! Created thread continues here tg.run([&]{ tbb::parallel_for(tbb::blocked_range<int>(0, SIZE), [&](const tbb::blocked_range<int> &r) { for(int i = 0; i != SIZE; i++) if(i % 2 == 0) myArray[i] = 1; } ); }); }); //! Main thread do this work tbb::parallel_for(tbb::blocked_range<int>(0, SIZE), [&](const tbb::blocked_range<int> &r) { for(int i = 0; i != SIZE; i++) if(i % 2 != 0) myArray[i] = 2; } ); //! Main thread waiting for 'tg' group //** it does not create any threads here (doesn't it?) */ limited.execute([&]{ tg.wait(); }); for(int i = 0; i < SIZE; i++) { cout << myArray[i] <<""; } cout << endl; return 0; } |
输出是:
0 2 0 2 ... 0 2
所以 limited.enque{tg.run{...}} 块不起作用。
有什么问题?有任何想法吗?谢谢。
你只为一个线程创建了
因此,为了等待
如果想看异步执行,手动设置arena的并发为2:
或禁用主线程的插槽保留:
附言TBB 没有保证线程来的点(与 OpenMP 不同)。只有