OpenMP double for loop



>我想使用 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);

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

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

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

#pragma omp critical
B.push_back(A);

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

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

最新更新