С++/QT/OpenMP: потоки, кажется, ждут, когда доступ к одному экземпляру

111
7

Я использую C++, Qt и OpenMP для алгоритма, который делает некоторый процесс на графике (дуги и узлы). Класс Node использует статический класс, который управляет графом (класс Graph) с списком смежности указателей на узлах. Я могу спросить наследников или предшественников узла, и я получаю QList указателя на узлы.

Цель состоит в том, чтобы найти некоторые ограниченные пути в графе.

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

Когда я использую n потоков, время вычисления равно n раз подряд. Зачем? Ожидают ли потоки, если они используют один и тот же метод в одном экземпляре? Все структуры Qt я использую, являются реентерабельными. Моя тоже должна быть, кроме того, что я использую статические элементы. Но ничего не меняется.

Есть идеи?

спросил(а) 2021-01-19T15:03:57+03:00 9 месяцев, 1 неделя назад
1
Решение
79

Хорошо, я нашел проблему. Я использую QDateTime, и я часто использую toTime_t() для преобразования даты в целое число. Это требует много времени. Я думал, что целое было членом. Я думаю, что он вычисляет каждый раз дату.

Но я не понимаю разницы во времени. Если я использую 1 нить, параллельная часть занимает 400 мс. Если я делю проблему на 4 потока, это займет 1600 мс параллельно! Но если я выполняю 4 потока один за другим, каждый принимает 100 мс с суммарным 400 мс. Использует ли функция системный вызов или использует поточное безопасное статическое преобразование?

Так или иначе, теперь все работает отлично! Я сохраняю один раз результат toTime_t() внутри моего класса.

ответил(а) 2021-01-19T15:03:57+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема