Я пытаюсь использовать 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. Я попытался скомпилировать проект с оптимизацией и без нее, без разницы.
Заранее большое спасибо!