mardi 5 mai 2015

TBB task_arena & task_group usage for scaling parallel_for work

I am trying to use the Threaded Building Blocks task_arena. There is a simple array full of '0'. Arena's threads put '1' in the array on the odd places. Main thread put '2' in the array on the even places.

/* 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;
}

The output is: 0 2 0 2 ... 0 2 So the limited.enque{tg.run{...}} block doesn't work. What's the problem? Any ideas? Thank you.

Aucun commentaire:

Enregistrer un commentaire