Как мы используем многопоточность в геометрическом ядре

    Вопрос о многопоточности задают даже далёкие от разработки люди, когда речь заходит о производительности 3D-приложений, в частности систем проектирования (САПР). Поддержка многопоточности закладывается в геометрическом ядре системы. Поэтому мы решили на своём примере показать, какие механизмы для этого разработаны и как они помогают использовать многопоточные вычисления в 3D-приложении.

    Этот пост подготовила Татьяна Митина, сотрудник C3D Labs, в прошлом Intel (читатели Хабра знакомы с ней по истории «Мне 57 лет, и я scrum-мастер»).

    image
    Модель завода с технологическим оборудованием в КОМПАС-3D
    ООО «ОКБ» (Новосибирск)


    Параллельные вычисления — наше будущее.
    И так будет всегда!


    Эта старая программистская шутка напоминает о важности использования многопоточности в приложениях и о перспективах развития параллельных вычислений, а также намекает на сложности параллельного программирования.

    Мы началу работу по организации многопоточной обработки данных в геометрическом ядре C3D несколько лет назад. Поддержка многопоточности в нашем случае включает в себя две составляющие:

    1. Использование многопоточных вычислений в ядре.
    2. Обеспечение потокобезопасности ядра, которое, кроме поддержки параллельных вычислений самого ядра, еще и поддерживает пользовательскую многопоточность. Другими словами, обеспечивает безопасность использования интерфейсов ядра в параллельных вычислениях в пользовательском приложении.

    Для организации внутренней многопоточности ядра мы используем технологию OpenMP. Это открытый стандарт для распараллеливания программ на С, С++ и Fortran, который реализуется в той или иной степени большинством популярных компиляторов.

    Применение технологии OpenMP для оптимизации кода ядра позволяет решить проблемы его кроссплатформенности и совместимости.

    Компиляторы обеспечивают поддержку OpenMP в разной степени. Например, на данный момент компилятор Intel С++ реализует OpenMP версии 4.5 и некоторое подмножество OpenMP версии 5.0, тогда как компилятор Microsoft C++ обеспечивает поддержку только OpenMP версии 2.0.

    Параллельные вычисления в геометрическом ядре


    Основные многопоточные операции ядра C3D включают в себя:

    • построение плоских проекций,
    • расчет полигональных сеток,
    • расчет массо-центровочных характеристик,
    • операции конвертеров,

    но не ограничиваются данным списком.

    image
    Время работы функции MassInertiaProperties() в разных режимах ядра на примере системы КОМПАС-3D

    Реализация параллельной обработки независимых данных, как правило, относительно проста и достаточно эффективна.

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

    Самым простой способ – использование блокировок, когда поток получает монопольный доступ к совместно используемым данным путём их блокирования.

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

    В ядре C3D эффективность параллельных вычислений и потокобезопасность объектов обеспечивается специальным механизмом – многопоточными кэшами.

    Потокобезопасный доступ к объектам ядра

    Один из методов оптимизации вычислений — это кэширование данных, которое основано на предположении, что значения параметров, для которых проводятся вычисления, не являются произвольными, а подчиняются некоторой (предопределенной или статистически предсказуемой) закономерности, что позволяет повторно использовать уже вычисленные ранее результаты.

    Использование кэширования, обычно эффективное при последовательном выполнении вычислений, при параллельном выполнении может спровоцировать «гонки данных», когда несколько потоков соперничают за обладание общими кэшированными данными.

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

    Как работают многопоточные кэши

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

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

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

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

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

    Режимы многопоточности ядра

    Режим многопоточности ядра управляет механизмом потокобезопасности объектов ядра, а также определяет, какие операции в ядре будут распараллеливаться.

    Ядро C3D может работать в следующих режимах:

    • Режим Off – многопоточность ядра отключена. Все операции ядра выполняются последовательно. Механизм, обеспечивающий потокобезопасность объектов ядра, отключен.
    • Режим Standard – стандартный режим многопоточности. Работает ограниченное распараллеливание операций ядра (распараллеливаются только операции, обрабатывающие независимые данные). Механизм потокобезопасности объектов ядра отключен.
    • Режим SafeItems – режим потокобезопасности объектов ядра, при котором включается механизм многопоточного кэширования, но по-прежнему работает ограниченное распараллеливание операций ядра. Данный режим разработан для поддержки многопоточных операций в пользовательских приложениях.
    • Режим Items – максимальный режим многопоточности ядра, когда включен механизм многопоточного кэширования и идёт распараллеливание всех операций ядра, где вычисления могут выполняться параллельно.

    У разработчиков, работающих с ядром C3D, есть возможность динамически изменять режим его многопоточности.

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


    Реализация геометрического ядра ориентирована на поддержку многопоточного использования интерфейсов ядра в пользовательских приложениях.

    Как обеспечивается потокобезопасность ядра

    Все геометрические объекты ядра являются потокобезопасными при условии использования механизма многопоточного кэширования (режим многопоточности не ниже SafeItems).

    Большинство операций ядра (включая те, которые не являются многопоточными) являются потокобезопасными, т.е. могут использоваться в нескольких потоках, если установлен режим многопоточности не ниже SafeItems.

    Блокировки ядра реализованы на базе нативных механизмов синхронизации (таких, как WinAPI на Windows и pthread API на Linux), что обеспечивает безопасность использования интерфейсов ядра в пользовательских приложениях, использующих различные механизмы распараллеливания.

    Предоставляются интерфейсы для уведомления о начале и конце параллельных вычислений, в которых используются интерфейсы ядра.

    Важно! Пользовательское приложение, вызывающее интерфейсы C3D из нескольких потоков, должно уведомлять ядро о входе в параллельные вычисления и выходе из них.

    Управление режимами многопоточности ядра

    У пользователей ядра C3D есть возможность динамически менять режим многопоточности ядра.
    Изменение режима многопоточности позволяет:

    • управлять потокобезопасностью объектов ядра (включать/выключать многопоточное кэширование)
    • определять, какие операции ядра будут распараллеливаться – все или только те, которые обрабатывают независимые данные.

    Когда это может пригодиться? В некоторых случаях наличие внутренних параллельных циклов ядра может оказывать влияние на эффективность внешнего распараллеливания в пользовательском приложении.

    Важно! Необходимость переключения режима многопоточности ядра надо анализировать в каждом конкретном случае.

    Использование интерфейсов ядра в многопоточном приложении

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

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

    Для этого рекомендуем один из следующих способов:

    • класс ParallelRegionGuard (защитник параллельного региона в области видимости)
    • функции EnterParallelRegion и ExitParallelRegion
    • макросы ENTER_PARALLEL и EXIT_PARALLEL.

    image
    Примеры уведомления ядра о входе в параллельный регион и выходе из него

    Заключение


    Подведем итоги. Мы активно использует внутренние многопоточные вычисления. Особенностью ядра C3D является возможность выбора режимов многопоточности при выполнении математических расчётов. Ядро предоставляет пользователям возможность динамически менять режим внутренней многопоточности ядра.

    Ядро поддерживает пользовательскую многопоточность, обеспечивая потокобезопасность операций ядра и предоставляя потокобезопасный доступ к данным объектов ядра. Ядро может быть сконфигурировано под особенности организации многопоточности в пользовательском приложении.
    АСКОН
    Russia's largest engineering software developer
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 10

      0
      Подскажите пожалуйста, интеловская реализация Openmp поддерживает больше чем 64 потока под windows у вас? Используете ли вы numa-aware аллокаторы?
        0

        У нас нет свежих данных для реализации OpenMP в последних версиях компилятора Интел. Ядро C3D используется в самых разных средах разработки, однако в настоящее время наши клиенты не пользуются компилятором Интел.


        Что касается "погони" за количеством потоков, природа наших данных и характер алгоритмов таковы, что в большинстве случаев эффективнее обрабатывать задания большего размера стандартным (8) количеством потоков.


        Мы не используем numa-aware memory аллокаторы.

        0
        Возникают ли проблема oversubscribtion при использовании пользовательской многопоточности? Если да, то решаете ли вы ее каким-либо образом?
          0

          С ситуациями thread oversubscription в геометрическом ядре мы не сталкиваемся. В большинстве случаев создание потоков при распараллеливании отдано на откуп OpenMP.


          О случаях oversubscription в пользовательских приложениях, использующих ядро, нам не известно. Думаю, что в таких случаях может помочь возможность переключения режима многопоточности ядра, описанная выше.

          –1
          Ребята, вы делаете классный продукт, но отношение к клиенту и продуктовые требования все убивают…
          Можно я напишу сюда, ибо больше нигде не слышат?! Страдания… Они были всегда… На самом деле нет! Начиналось еще все с универа и, надо отметить, что учась на инженера, я никогда не испытывал проблем с вашим продуктом, несмотря на 2004 (вроде бы) год: то есть все, что требовалось по программе отлично выходило и не вызывало проблем. Но инженером я почти не работал, точнее работал, но сфера была другой. После этого много воды утекло: появилось много нового, в том числе и открытого, ПО с похожим функционалом, а что-то из подобного наоборот — умерло. Менялись поколения софта, подходы к проектированию, инженерная школа даже успела подстроиться под новые реалии в какой-то мере. Не менялось одно — подход к клиенту на российском рынке у большинства компаний. К сожалению, не смотря на прогресс, и у вас тоже. Я не знаю почему, но удобно не слышать клиента, все пытаются оторвать кусок пирога по принципу «у нас это есть формально — а остальное не важно», вместо того, чтобы развивть продукт не для ГОС, а для ВСЕХ. Вот и статьи ваши, направлены на завоевание репутации, а действия тем не менее, даже на собственном форуме поддержки говорят о безразличии к клиенту: люди страдают от версии к версии с неработающей параметризацией, с ошибоками округления и привязок (точнее их периодическим отсутствием). Я, кримеру, не комментировал на хабре 3 года — нужды как-то не было, но резко возникшие боли при поытке триала, все же заставили это сделать, ибо на моменте знакомства с продуктом все было просто замечательно, но погружаясь все глубже и глубже я получал все больше стимуляторов не приобретать его. Я все понимаю, включая коммерческую составляющую, но смею просить починить хотя бы базовый функционал: геометрию (описанные выше привязки, параметризацию и сделать адекватное проецирование в сборке — это так, чтобы оно не писало о вырожденных проекциях и ребрах в только что созданном для проецирования эскизе, при его закрытии). Я уже не говорю о сломанных очередной поставленной, не в том порядке конфигурацией, засчеками против стрелочек, что справедливо и в обратном направлении, и совсем не лечится никакими настройками. Не становитесь 1С из 90х, ну пожалуйста. Они, кстати, сделали шаг вперед (на самом деле), не смотря на «остатки былой роскоши». Начните ценить клиента (обычного, физического), отвечайте на его вопросы, хотя бы на форуме, и хотя бы раз в неделю. Собирайте информацию, а не игнорируйте ее. Верю, что мир становится лучше. Искренне надеюсь на понимание. Все еще желаю стать клиентом.Желаю всего самого хорошего. Спасибо за внимание.
            +1
            Я не знаю почему, но удобно не слышать клиента, все пытаются оторвать кусок пирога по принципу «у нас это есть формально — а остальное не важно», вместо того, чтобы развивть продукт не для ГОС, а для ВСЕХ.

            Мы единственная компания на мировом рынке, которая предоставляет домашним пользователям полную неурезанную версию профессионального трёхмерного необлачного САПР. Так что мы делаем продукт для всех.
            даже на собственном форуме поддержки

            Техническая поддержка оказывается всем пользователям любых версий (не только коммерческих), оказывается она только в личном кабинете технической поддержки:
            sd.ascon.ru/otrs/customer.pl
            Оказание поддержки включает предоставление обратной связи каждому обратившемуся по каждому обращению.

            Форума поддержки у нас нет, только форум пользователей. Там пользователи общаются друг с другом и поддержка там не оказывается. Сотрудники следят за форумом, но отвечают пользователям на форуме крайне редко, чтобы не мешать их взаимному общению. Даже главный модератор форума — это пользователь, а не сотрудник компании. Информацию с форума при этом используют в работе, в том числе фиксируются все замеченные пользователями ошибки.

            Я уже не говорю о сломанных очередной поставленной, не в том порядке конфигурацией, засчеками против стрелочек

            Судя по всему вы поставили строительную конфигурацию и применили строительные настройки. Для чего вы это сделали, если вы её не используете? Не надо так делать, поставьте только то, чем планируете пользоваться. Строительные стандарты отличаются от машиностроительных и для них существуют свои настройки программы, которые вы и применили. Это абсолютно корректная работа и никаких ошибок здесь нет.

            люди страдают от версии к версии с неработающей параметризацией, с ошибоками округления и привязок (точнее их периодическим отсутствием).

            Это вы решили прочитав форум, или это у вас лично проявлялись такие ошибки? Вы сообщали о них в службу технической поддержки? Попробуйте все же обратиться в нашу службу технической поддержки. С каждой возникшей проблемой детально разберутся и подскажут вам варианты решения.
              0
              Мы единственная компания на мировом рынке, которая предоставляет домашним пользователям полную неурезанную версию профессионального трёхмерного необлачного САПР. Так что мы делаем продукт для всех.

              Это немного не так, если честно, например, она режет возможность открытия (я бы понял редактирования) в проф версии, таким образом, начертив что-то я просто не могу отдать на производство в родном формате (к примеру корпус на гибку или лазерную резку) надо пользовать dxf и все это извращение. Сделайте родной формат обмена и проблем не будет.
              Я знаю, что вы единственная и далеко не плохая, для этого и решил попробовать HOME версию, чтобы потом приобрести.
              Форума поддержки у нас нет, только форум пользователей. Там пользователи общаются друг с другом и поддержка там не оказывается. Сотрудники следят за форумом, но отвечают пользователям на форуме крайне редко, чтобы не мешать их взаимному общению.

              Следить, это конечно удобно, но вот надо бы еще и взаимодействовать, ну правда… Вы сейчас описываете среду взаимодействия, которая сформировалась во множестве ex-USSR контор, это не плохо и это ваша модель, я же пытаюсь сказать, что сформировав комьюнити, как тот же Autodesk с их Fusion 360 (который кстати до недавнего времени был бесплатен не только для дома, но и для мелких проиозводств, но не хотелось бы касаться сейчас модели монетизации).
              Судя по всему вы поставили строительную конфигурацию и применили строительные настройки. Для чего вы это сделали, если вы её не используете? Не надо так делать, поставьте только то, чем планируете пользоваться. Строительные стандарты отличаются от машиностроительных и для них существуют свои настройки программы, которые вы и применили. Это абсолютно корректная работа и никаких ошибок здесь нет.

              Откуда вам знать пользуюсь я или нет? Вообще-то пользуюсь, стояло одновременно две конфигурации и я даже переключался между ними, но вот есть особенность, что настройки применяются те, которые применила последняя установка, наплевав на то, что в параметрах я указываю четко то, что мне надо или вообще отключаю засечки. Дело тут не в поддержке или ответе ее, весь форум пользователей кипел от этого, починил я это применением базовых настроек с профиля, что идет с установкой и дальнейшим выбором конфигурации: бага это, или фитча? Ну и я в курсе, чем отличаются стандарты и какие они есть, хотя, вопросы к пониманию компасом ЕСКД у меня некоторые есть, но оставим их за рамками.
              Это вы решили прочитав форум, или это у вас лично проявлялись такие ошибки? Вы сообщали о них в службу технической поддержки? Попробуйте все же обратиться в нашу службу технической поддержки. С каждой возникшей проблемой детально разберутся и подскажут вам варианты решения.

              Ну вот опять, вы считаете, что пользователь тупее вас. Ну так ведь? А это не всегда так… Есть даже официальные ответы и с округлениями и с тем, что проекции вырождаются, и даже с тем, что невозможно построить кривую пересечения с плоскостью (казалось-бы математически бесконечную) и тела, если плоскость не растянуть за пределы этого тела, то есть чтобы оно пересекало его. Это все не так страшно, это просто особенности. Траблы с привязками и колдованием их сочетанием, чтобы проставить авторазмер от ребра до, скажем, окружности (не до ее центра), дабы хоть как-то параметризовать размерность в эскизе, кстати говоря, сделать это не возможно, если стенка вне плоскости, например размер нужен от скругления и прямая образующая как бы проецируется на эскиз, так вот с размерами это не работает почему-то, а от вспомогательной прямой оно не может взять привязку. Почему я могу построить резьбу и шестерни в валах, но не могу нанести гостовую резьбу в отверстие корпуса, чтобы напечатать его на принтере? Это ж прям жесть, а вы позиционируете его и для моделистов тоже. Нет, я, конечно, могу сделать валы-закладки с резьбой и собрать их в корпус по сопряжениям, но это как-то за гранью =)

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

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

                Отлично записывайте и отправляйте всё в техподдержку. Будем ждать ваши запросы.
                  0
                  Ну не мне вас учить пользоваться собственным форумом, но все же Поиск
                  А про все остальное мы дипломатично умолчим… Удобно.
                    0
                    Раз ссылку вы давать не хотите, значит никакого кипения в действительности нет, правильно я понимаю?

          Only users with full accounts can post comments. Log in, please.