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

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

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

но в итоге я использовал другую стороннюю библиотеку, которая работает очень быстро по сравнению с предыдущими и использует 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();
}

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


person 888    schedule 24.01.2013    source источник
comment
В общем, если явно не указано, что потокобезопасен, вы можете рассматривать все как не потокобезопасный.   -  person Some programmer dude    schedule 24.01.2013
comment
Неясно, связано ли это с безопасностью потоков вашей библиотеки или с ошибкой в ​​вашем коде. Неясно, стоит ли вам беспокоиться о безопасности потоков.   -  person Mikhail    schedule 24.01.2013
comment
@Mikhail Вы правы, я отредактирую свой вопрос   -  person 888    schedule 24.01.2013
comment
Вы сказали, что выбрали FIST, потому что он быстрее. Вы говорите о сумме Минковского, о триангуляции или о том и другом?   -  person sloriot    schedule 24.01.2013
comment
@sloriot Извините, если мое объяснение непонятно. Мне нужна сумма Минковского, но сторонняя библиотека для вычисления суммы Минковского, которую я выбрал, вызывает библиотеку FIST. Поскольку у меня есть исходный код, я могу заменить библиотеку FIST другой библиотекой триангуляции.   -  person 888    schedule 24.01.2013
comment
ОК, я не знаю о FIST, но, насколько я знаю, у вас может быть несколько экземпляров триангуляции CGAL в разных потоках.   -  person sloriot    schedule 24.01.2013
comment
Вы объясняете многое из того, что вы делаете и как вы это делаете, но на самом деле вы не показываете код; если вы ожидаете помощь с кодом, дайте нам несколько фрагментов для работы   -  person Dariusz    schedule 28.01.2013
comment
Вы можете добавить свои лицензионные требования к вопросу: очевидно, вы хотите что-то бесплатное, но не GPL, поэтому я полагаю, что это похоже на BSD.   -  person Marc Glisse    schedule 28.01.2013
comment
Что ж, самый простой способ обойти ваши проблемы с потокобезопасностью — не использовать потоки — вместо этого используйте несколько процессов. Если вы примерно заранее знаете, как разделить задачи между процессами, вам потребуется очень мало связи между процессами.   -  person Marc Glisse    schedule 28.01.2013
comment
@MarcGlisse Если бы лицензия была похожа на BSD, это было бы замечательно! В противном случае мне нужна (не слишком дорогая!) ​​коммерческая лицензия.   -  person 888    schedule 28.01.2013
comment
@ 888 Что вам нужно, так это базовая гарантия безопасности потоков, которая должна быть предоставлена, например. КГАЛ...   -  person Paul Michalik    schedule 28.01.2013


Ответы (3)


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

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

person lrineau    schedule 24.01.2013
comment
Я знаю, что пакет 2D-триангуляции CGAL может использовать любое ядро ​​(что хорошо для меня, так как мне не нужно конкретное), но я, вероятно, исключаю его, потому что коммерческая лицензия довольно дорогая для нас. Извините, но мой босс предпочитает держать в секрете библиотеку, которую мы используем. - person 888; 24.01.2013

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

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

person FatalFlaw    schedule 28.01.2013

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

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

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

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

person Paul Michalik    schedule 26.01.2013