Я пишу программное обеспечение на C ++, которое требует быстрых вычислений суммы Минковского. Реализация на основе двойных достаточно.
Я оценил некоторые геометрические библиотеки, такие как
но в итоге я использовал другую стороннюю библиотеку, которая работает очень быстро по сравнению с предыдущими и использует FIST библиотека для триангуляции.
Мой код работает более или менее следующим образом:
Поскольку вычисления внутри цикла независимы от цикла к циклу, я распараллелил цикл, и все работало нормально.
Затем я решил переместить вычисление суммы Минковского в каждом параллельном раунде:
Я беру результат с лучшим значением как конечный результат
но сторонняя библиотека больше не работала.
я получил number_of_threads - 1
сообщения об ошибках
Утверждение не удалось.
Файлы, вызывающие ошибку утверждения, меняются от запуска к выполнению и от потока к потоку, но все они являются c-файлами, имеющими то же имя, что и заголовки FIST (хотя у меня есть исходный код сторонней библиотеки, у меня есть только a. lib и заголовки библиотеки FIST)
Как указывалось ранее, я пытался вычислить все необходимые мне суммы Минковского вне распараллеленного кода и использовать полученные в нем результаты. Это было хорошо Так что я почти уверен, что проблемы исходят от FIST.
У меня есть два вопроса:
Знаете ли вы, если FIST библиотека потокобезопасна?
Если нет, то не могли бы вы предложить мне поточно-безопасную (C или, лучше) библиотеку триангуляции C ++ для замены FIST (возможно, с сопоставимыми характеристиками)?
редактировать:
На самом деле, я не знаю, является ли «потокобезопасный» именно тем, что я хочу: мне нужна только библиотека трингуляции, способная одновременно вычислять много независимых триангуляций.
Я думаю, что если в библиотеке не было глобальных переменных, и если у нее был класс без static
переменные
class triangulation
{
// no static variables
void execute_triangulation();
}
этого может быть достаточно.
Поэтому я мог использовать разные экземпляры этого класса и параллельно запускать их метод.
Вы, вероятно, можете использовать 2D триангуляционный пакет CGAL заменить FIST, а затем использовать его в качестве входных данных той сторонней библиотеки, которая выполняет суммы по Минску. Триангуляции CGAL очень быстрые и надежные. Вы можете триангулировать полигоны и сложные формы, используя ограниченную триангуляцию Делоне.
Кстати, какую библиотеку Минковского вы используете?
Одним из возможных и сразу же проверяемых решений является размещение мьютекса вокруг кода, который вызывает вычисления Минковского. Если это звучит интересно, и вы не знаете, как это сделать, добавьте комментарий с подробным описанием платформы, которую вы используете, и я, или кто-то еще, опишу, как это сделать.
По крайней мере, это покажет вам, правильно ли вы определили проблему. Если расчеты составляют небольшую часть вашей общей пропускной способности, то это может оказаться хорошим решением — в противном случае это всего лишь шаг в пути.
Это очень сильно зависит от того, что вы подразумеваете под этим:
Поскольку мой код распараллелен, я ввел многопоточность
Вы должны быть более конкретными, чтобы получить помощь. Что значит «вы ввели многопоточность»? Например, ни в одной из упомянутых вами библиотек нет встроенных параллельных вычислений сумм Минковского (или чего-либо еще) — вам придется распараллеливать их самостоятельно.
Что касается сумм Минковского, то можно использовать подход сокращения карт: разбить входной набор данных на более мелкие части, вычислить сумму Минковского для каждого параллельно (карта) и объединить промежуточные результаты, полученные от независимых работников (уменьшить ). Требования для этого являются основной гарантией безопасности потока (которую дает, например, CGAL) с доступом только для чтения к параметрам вычисления.