Потокобезопасная библиотека триангуляции

Я пишу программное обеспечение на C ++, которое требует быстрых вычислений суммы Минковского. Реализация на основе двойных достаточно.

Я оценил некоторые геометрические библиотеки, такие как

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

Мой код работает более или менее следующим образом:

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

Поскольку вычисления внутри цикла независимы от цикла к циклу, я распараллелил цикл, и все работало нормально.

Затем я решил переместить вычисление суммы Минковского в каждом параллельном раунде:

  • Я читаю свои полигоны
  • Для number_of_threads (= n) раз
    • Я решаю, какие полигоны использовать в следующих вычислениях
    • Я вычисляю суммы Минковского, которые мне нужны в этом раунде
    • Я делаю кое-что на основе сумм Минковского
    • Я оцениваю результат
  • Я беру результат с лучшим значением как конечный результат

    но сторонняя библиотека больше не работала.

я получил number_of_threads - 1 сообщения об ошибках

Утверждение не удалось.

Файлы, вызывающие ошибку утверждения, меняются от запуска к выполнению и от потока к потоку, но все они являются c-файлами, имеющими то же имя, что и заголовки FIST (хотя у меня есть исходный код сторонней библиотеки, у меня есть только a. lib и заголовки библиотеки FIST)

Как указывалось ранее, я пытался вычислить все необходимые мне суммы Минковского вне распараллеленного кода и использовать полученные в нем результаты. Это было хорошо Так что я почти уверен, что проблемы исходят от FIST.

У меня есть два вопроса:

  • Знаете ли вы, если FIST библиотека потокобезопасна?

  • Если нет, то не могли бы вы предложить мне поточно-безопасную (C или, лучше) библиотеку триангуляции C ++ для замены FIST (возможно, с сопоставимыми характеристиками)?

редактировать:

На самом деле, я не знаю, является ли «потокобезопасный» именно тем, что я хочу: мне нужна только библиотека трингуляции, способная одновременно вычислять много независимых триангуляций.

Я думаю, что если в библиотеке не было глобальных переменных, и если у нее был класс без static переменные

class triangulation
{
// no static variables

void execute_triangulation();
}

этого может быть достаточно.
Поэтому я мог использовать разные экземпляры этого класса и параллельно запускать их метод.

6

Решение

Вы, вероятно, можете использовать 2D триангуляционный пакет CGAL заменить FIST, а затем использовать его в качестве входных данных той сторонней библиотеки, которая выполняет суммы по Минску. Триангуляции CGAL очень быстрые и надежные. Вы можете триангулировать полигоны и сложные формы, используя ограниченную триангуляцию Делоне.

Кстати, какую библиотеку Минковского вы используете?

3

Другие решения

Одним из возможных и сразу же проверяемых решений является размещение мьютекса вокруг кода, который вызывает вычисления Минковского. Если это звучит интересно, и вы не знаете, как это сделать, добавьте комментарий с подробным описанием платформы, которую вы используете, и я, или кто-то еще, опишу, как это сделать.

По крайней мере, это покажет вам, правильно ли вы определили проблему. Если расчеты составляют небольшую часть вашей общей пропускной способности, то это может оказаться хорошим решением — в противном случае это всего лишь шаг в пути.

2

Это очень сильно зависит от того, что вы подразумеваете под этим:

Поскольку мой код распараллелен, я ввел многопоточность

Вы должны быть более конкретными, чтобы получить помощь. Что значит «вы ввели многопоточность»? Например, ни в одной из упомянутых вами библиотек нет встроенных параллельных вычислений сумм Минковского (или чего-либо еще) — вам придется распараллеливать их самостоятельно.

Что касается сумм Минковского, то можно использовать подход сокращения карт: разбить входной набор данных на более мелкие части, вычислить сумму Минковского для каждого параллельно (карта) и объединить промежуточные результаты, полученные от независимых работников (уменьшить ). Требования для этого являются основной гарантией безопасности потока (которую дает, например, CGAL) с доступом только для чтения к параметрам вычисления.

1
По вопросам рекламы [email protected]