Wooni
Wooni

Reputation: 501

OpenMP double for loop

I'd like to use openMP to apply multi-thread. Here is simple code that I wrote.

vector<Vector3f> a;
int i, j;
for (i = 0; i<10; i++) 
{
    Vector3f b;
#pragma omp parallel for private(j)

    for (j = 0; j < 3; j++)
    {
        b[j] = j;
    }
    a.push_back(b);
}

for (i = 0; i < 10; i++) 
{
    cout << a[i] << endl;
}

I want to change it to works lik :

parallel for1
{
    for2
}

or

for1
{
   parallel for2
}

Code works when #pragma line is deleted. but it does not work when I use it. What's the problem?

///////// Added

Actually I use OpenMP to more complicated example, double for loop question.

here, also When I do not apply MP, it works well. But When I apply it, the error occurs at vector push_back line.

vector<Class> B;
for 1
{
    #pragma omp parallel for private(j) 
    parallel for j 
    {
        Class A;
        B.push_back(A); // error!!!!!!!
    }
}

If I erase B.push_back(A) line, it works as well when I applying MP.

I could not find exact error message, but it looks like exception error about vector I guess. Debug stops at

void _Reallocate(size_type _Count)
    {   // move to array of exactly _Count elements
    pointer _Ptr = this->_Getal().allocate(_Count);

    _TRY_BEGIN
    _Umove(this->_Myfirst, this->_Mylast, _Ptr);

Upvotes: 0

Views: 867

Answers (1)

Zulan
Zulan

Reputation: 22670

std::vector::push_back is not thread safe, you cannot call that without any protection against race conditions from multiple threads.

Instead, prepare the vector such that it's size is already correct and then insert the elements via operator[].

Alternatively you can protect the insertion with a critical region:

#pragma omp critical
B.push_back(A);

This way only one thread at a time will do the insertion which will fix the error but slow down the code.

In general I think you don't approach parallelization the right way, but there is no way to give better advise without a clearer and more representative problem description.

Upvotes: 1

Related Questions