对类成员进行操作的并行循环

时间:2018-05-07 20:08:23

标签: c++ parallel-processing openmp

我试图使用openMP来并行化我在C ++中编程的汽车相对复杂的仿真模型的某些部分。

整个模型由几个嵌套类组成。班级的每个实例" Vehicle"有四个类" Suspension"的实例,每个实例都有一个Tire类的实例。还有更多内容,但它不应该与问题相关。

我试图在每个集成步骤中使用如下代码并行化Suspension的更新。此代码是包含其他模拟数据的另一个类的一部分,包括一个或多个汽车。

for (int iCar = 0; iCar < this->numberOfCars; iCar++) { 
    omp_set_num_threads(4);
    #pragma omp parallel for schedule(static, 1)
    for (int iSuspension = 0; iSuspension < 4; iSuspension++) { 
        this->cars[iCar].suspensions[iSuspension].update();
    }
}

我实际上已经简化了一点,并改变了变量名称,希望能让它更容易理解(而不是通过这样做来掩盖问题!)

方法&#34;更新&#34;只计算每个时间步的相应暂停的一些数据,并将其保存在自己的Suspension类实例的几个比例中。类Suspension的所有实例都是相互独立的,因此每次调用方法都会更新&#34;仅访问包含在&#34; Suspension&#34;的同一实例中的数据。

我使用调试器的行为可以描述如下:

  • 首次运行循环(在模拟的第一个步骤),它运行正常。总是。所有四种暂停都正确更新。

  • 循环第二次运行,或者最迟在第三次运行循环时,至少有一个暂停使用相关数据进行更新。两个暂停变得完全相同(损坏)数据是非常常见的,这些数据不可能,因为它们从一开始就配置略有不同的参数。

  • 如果我用一个循环而不是四个循环(omp_set_num_threads(1))运行它,它可以完美地运行。毋庸置疑,当我在没有任何openMP预处理程序指令的情况下运行它时,同样适用。

我知道在不知道程序的其余部分是如何工作的情况下找出问题的解决方案可能是不可能的,但我希望有人至少可以告诉你是否有任何理由为什么你只是无法按照我尝试的方式访问并行openMP循环中的类的属性和方法。

我正在使用W10和Visual Studio 2017社区。我尝试使用和不使用优化来编译项目,没有区别。

提前多多感谢!

0 个答案:

没有答案