Я пишу программу на C++, которая требует быстрых вычислений суммы Минковского. Достаточно реализации, основанной на double.
Я оценил некоторые геометрические библиотеки, такие как
- CGAL
- LEDA
- boost::geometry (не нет реализации суммы Минковского, но есть руководство, объясняющее, как это реализовать)
но в итоге я использовал другую стороннюю библиотеку, которая работает очень быстро по сравнению с предыдущими и использует FIST библиотека для триангуляции.
Мой код работает более или менее следующим образом:
- Я читаю свои полигоны
- Я вычисляю суммы Минковского, которые мне нужны
- For n times
- I decide which polygons to use in the following computation
- Я делаю некоторые вещи, основанные на суммах Минковского.
- Я даю оценку результату
- Я беру результат с лучшим значением как окончательный результат
Поскольку вычисления в цикле не зависят от раунда к раунду, я распараллелил цикл, и все заработало нормально.
Затем я решил перенести вычисление суммы Минковского в каждый параллельный раунд:
- Я читаю свои полигоны
- For number_of_threads(=n) times
- I decide which polygons to use in the following computation
- Я вычисляю суммы Минковского, которые мне нужны в этом раунде.
- Я делаю некоторые вещи, основанные на суммах Минковского.
- Я даю оценку результату
- Я беру результат с лучшим значением как окончательный результат
но сторонняя библиотека больше не работала.
Я получаю number_of_threads - 1
сообщения об ошибках, говорящие
Утверждение не удалось.
Файлы, вызывающие сбой утверждения, меняются от запуска к запуску и от потока к потоку, но все они представляют собой c-файлы с тем же именем, что и заголовки FIST (хотя у меня есть исходный код сторонней библиотеки, у меня есть только файл . lib и заголовки библиотеки FIST)
Как указывалось ранее, я попытался вычислить все необходимые мне суммы Минковского вне распараллеленного кода и использовать результаты внутри него. Это было нормально. Так что я почти уверен, что проблемы исходят от FIST.
У меня есть два вопроса:
Знаете ли вы, является ли библиотека FIST потоками? сейф?
Если нет, не могли бы вы предложить мне потокобезопасную (C или, лучше,) библиотеку триангуляции C++ для замены FIST (возможно, с сопоставимыми характеристиками)?
изменить:
На самом деле, я не знаю, является ли "потокобезопасность" именно тем, что мне нужно: мне нужна только библиотека трингуляции, способная вычислять множество независимых триангуляций одновременно.
Я думаю, что если бы в библиотеке не было глобальных переменных и если бы в ней был класс без static
переменных
class triangulation
{
// no static variables
void execute_triangulation();
}
этого может быть достаточно. Так что я мог бы использовать разные экземпляры этого класса и параллельно запускать их метод.