Совместное использование геометрии CGAL между процессами в Stack Overflow

Я ищу самый быстрый способ отправки геометрии CGAL между процессами (C ++). Предположим, что у нас есть 2 процесса — A и B. Процесс A генерирует геометрию, а процесс B отображает ее. Я хочу соединить их как можно быстрее. Геометрия имеет тип многогранника CGAL.

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

  1. Когда я хочу скопировать геометрию из процесса A в общую память, я могу использовать потоковый многогранник в / из формата OFF, но мне это не интересно, потому что преобразование в этот формат слишком медленное для моей цели.
  2. Я могу создать разделяемую память и использовать «размещение нового», чтобы создать свой объект в разделяемой памяти и преодолеть накладные расходы на потоковую передачу и преобразование, но тогда я больше не контролирую распределение памяти внутренними функциями многогранника. (Например, при добавлении новой вершины с помощью Polyhedron_incremental_builder_3 я не могу указать, где именно в памяти она должна быть размещена — я могу просто вызвать B.add_vertex (Point (0, 0, 0)); и выделение памяти выполняется в этом методе внутри)

Есть ли способ создать объект в определенном месте в общей памяти и убедиться, что он и его динамические структуры будут «жить» в этой памяти?

Или, может быть, существует другой быстрый способ обмена динамическими данными (например, структурами Halfedge) между двумя процессами?

4

Решение

У меня нет больше контроля над распределением памяти внутренним многогранником
функции.

Вы на самом деле есть контроль.

Справочное руководство гласит:

Класс Polygon_2 реализует полигоны.
Полигон_2 параметризован чертами
класс и контейнерный класс. Последний может быть любым классом, который выполняет
требования к контейнеру STL. По умолчанию используется вектор
учебный класс.

В дополнение к используя новое размещение для самого полигона, вам нужен контейнер, который вы можете поместить в общую память. Вы можете попробовать использовать boost::interprocess::vectorили сверните свой собственный класс контейнера.

Если вы используете boost::interprocess::vectorвам нужно будет создать для него класс-оболочку, потому что в отличие от контейнера STL, его конструктор требует распределителя объект. Polygon_2 не сможет построить его правильно. Таким образом, вам придется получить объект распределителя общей памяти из какой-то глобальной переменной. Например:

using namespace boost::interprocess;
typedef allocator<int, managed_shared_memory::segment_manager>  ShmemAllocator;
ShmemAllocator some_global_shmem_allocator;
template <typename T>
class my_shared_memory_vector : vector<T, ShmemAllocator>
{
public:
my_shared_memory_vector() : vector(some_global_shmem_allocator) {}
};

Отказ от ответственности: я на самом деле не сделал ничего этого сам. Если ваш компьютер загорелся в результате этого, и ваш дом сгорел, не считайте меня ответственным. Было бы разумно перепроверить (глядя на источник GCAL), что любая память Polygon_2 Распределение фактически управляется контейнером.

редактироватьЯ неправильно понял вопрос, он спрашивает о многогранниках, а не о многоугольниках. Смотрите комментарий ниже.

1

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

Конечно, самое очевидное, что нужно сделать, это использовать потоки вместо процессов. Это решило бы всю проблему без каких-либо усилий.

Кроме этого, если не считать хакерскую библиотеку времени выполнения вашего компилятора для замены управления памятью, вы можете переопределить «новый оператор» для класса и / или предоставить глобальный. Это позволит вам заменить «новые» вызовы собственным кодом выделения памяти. Вы можете использовать глобальный флаг, который вы устанавливаете перед выполнением вызовов CGAL, а затем сбрасываете, чтобы указать распределителю памяти, какую кучу памяти вы хотите использовать (вам, очевидно, придется сделать некоторую форму управления кучей для общей памяти).

Конечно, переопределение нового оператора будет работать только для «новых» вызовов. Все, что выделяется, например, через malloc () или какой-либо системный вызов не будет проходить через ваш код. Вы можете попытаться предоставить свои собственные вызовы malloc () и free () (функции, содержащиеся в объектных файлах, предпочтительнее функций из библиотек), чтобы посмотреть, может ли это работать, но, вероятно, им придется иметь дело с операционной системой для управления памятью. так как вы потеряете библиотечные функции. Это определенно будет грязно.

0

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