OpenMP双循环

时间:2017-03-15 09:53:20

标签: openmp

我想使用openMP来应用多线程。 这是我写的简单代码。

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

我想把它改成效果:

parallel for1
{
    for2
}

for1
{
   parallel for2
}

删除#pragma行时代码有效。但是当我使用它时它不起作用。有什么问题?

/////////已添加

实际上我将OpenMP用于更复杂的例子, 双循环问题。

这里,当我不申请MP时,它运作良好。 但是当我申请时, 错误发生在矢量push_back行。

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

如果我擦除B.push_back(A)行,当我应用MP时它也可以。

我找不到确切的错误消息,但它看起来像关于矢量的异常错误我猜。调试在

处停止
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);

1 个答案:

答案 0 :(得分:1)

std::vector::push_back不是线程安全的,如果没有针对来自多个线程的竞争条件的任何保护,你就无法调用它。

相反,准备向量使其大小已经正确,然后通过operator[]插入元素。

或者,您可以使用关键区域保护插入:

#pragma omp critical
B.push_back(A);

这样一次只有一个线程会进行插入,这将修复错误但会减慢代码。

总的来说,我认为你没有采用正确的方式进行并行化,但如果没有更清晰,更具代表性的问题描述,就没有办法提供更好的建议。