Параллельный цикл, работающий с членами класса - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь использовать openMP для распараллеливания некоторых частей относительно сложной имитационной модели автомобиля, который я программировал на C ++.

Вся модель состоит из нескольких вложенных классов. Каждый экземпляр класса «Автомобиль» имеет четыре экземпляра класса «Suspension», и у каждого из них есть один экземпляр класса Tire. Здесь есть кое-что еще, но это не должно относиться к проблеме.

Я пытаюсь распараллелить обновление приостановки на каждом этапе интеграции с помощью кода, который выглядит следующим образом. Этот код является частью другого класса, содержащего другие данные моделирования, включая один или несколько автомобилей.

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

Я на самом деле немного упростил это и изменил имена переменных, надеясь сделать его немного более понятным (и не скрывая проблему, если это так!)

Метод «update» просто вычисляет некоторые данные соответствующей приостановки на каждом временном шаге и сохраняет их в нескольких пропорциях своего собственного экземпляра класса Suspension. Все экземпляры класса Suspension не зависят друг от друга, поэтому каждый вызов метода «update» обращается только к данным, содержащимся в одном и том же экземпляре «Suspension».

Поведение, которое я получаю с помощью отладчика, можно описать следующим образом:

  • При первом запуске цикла (на первом этапе моделирования) он работает нормально. Всегда. Все четыре подвески обновлены правильно.

  • При втором запуске цикла или, самое позднее, в третьем, по крайней мере одна из приостановок обновляется с исправленными данными. Весьма распространено, что две приостановки становятся абсолютно одинаковыми (поврежденными) данными, что не должно быть возможным, так как они настроены с самого начала с немного другими параметрами.

  • Если я запускаю его с одним циклом вместо четырех (omp_set_num_threads (1)), он работает безупречно. Излишне говорить, что то же самое применимо, когда я запускаю его без каких-либо директив препроцессора openMP.

Я знаю, что, возможно, не удастся найти решение проблемы, не зная, как работает остальная часть программы, но я надеюсь, что кто-то хотя бы скажет, есть ли причина, по которой вы просто не можете получить доступ к свойства и методы класса в параллельном цикле openMP, как я пытаюсь это сделать.

Я использую W10 и Visual Studio 2017 Community. Я попытался скомпилировать проект с оптимизацией и без нее, без разницы.

Заранее большое спасибо!

...