isicad.ru :: портал САПР, PLM и ERP :: версия для печати

Статьи

18 октября 2016

C3D Labs оптимизирует ПО под многоядерную архитектуру Intel

Компания C3D Labs, дочернее предприятие группы АСКОН и резидент ИТ-кластера Сколково, объявляет о выходе программного инструментария C3D Toolkit 2016, поддерживающего применение параллельных технологий. Отличительной особенностью обновленного ПО является возможность выбора режимов многопоточности при осуществлении математических расчётов и обеспечение оптимальных показателей производительности за счёт расширенного использования вычислительных способностей многоядерных процессоров Intel.

Сотрудничество C3D Labs и корпорации Intel началось около года назад: был проведён совместный анализ отдельных участков кода ядра C3D, поддающихся распараллеливанию, по итогам которого специалисты из C3D Labs приступили к доработке программного обеспечения согласно рекомендациям Intel. В рамках доклада «Истории успеха использования программных инструментов» на прошедшей конференции Intel Software Conference 2016 Алексей Горячих, математик-программист C3D Labs из Нижнего Новгорода, представил результаты оптимизации вычислений на многоядерных процессорах с использованием технологии OpenMP, а также подробно описал реализацию потокобезопасного доступа к геометрическим объектам ядра C3D.

Из доклада Алексея следует, что на сегодняшний день многопоточность в модулях C3D реализована на двух уровнях:

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

Рисунок 1. Многопоточное проецирование в C3D Toolkit 2016

Информация для разработчиков: внутренняя многопоточность

В новой версии C3D Toolkit 2016 появилась возможность не только включать/выключать многопоточность с использованием булевого флага, но и настраивать многопоточность для целого класса задач. Специально для этого были введены различные режимы MbeMultithreadedMode:

Режим Описание
mtm_Off Многопоточность отключена
mtm_Base Многопоточность в базовых алгоритмах (включена во все остальные режимы)
mtm_Converters Многопоточность в конверторах
mtm_Sections Многопоточный расчет сечений
mtm_Items Многопоточный доступ к геометрическим объектам
mtm_Solids Многопоточный доступ к телам (включает mtm_Items)
mtm_Standard Многопоточность, соответствующая версии 16 (включает mtm_Base, mtm_Converters, mtm_Sections)
mtm_Max Максимальный многопоточный режим


По умолчанию в ядре C3D установлен режим mtm_Standard. Переключение межу режимами mtm_Standard и mtm_Base соответствует включению/выключению многопоточности в предыдущих версиях ядра C3D.

Для переключения между режимами многопоточности добавлены методы:

Метод Описание Предыдущие версии
bool Math::Multithreaded() Проверяет, включен ли режим mtm_Standard Проверяет, включена ли многопоточность
void Math::SetMultithreaded( bool b ) Если b false, тогда отключает многопоточность (mtm_Off). Если b true, тогда устанавливает режим mtm_Standard Устанавливает многопоточность согласно b
MbeMultithreadedMode Math::MultithreadedMode() Запрашивает режим многопоточности
bool Math::CheckMultithreadedMode(MbeMultithreadedMode mode ) Проверяет режим многопоточности
void Math::SetMultithreadedMode(MbeMultithreadedMode mode ) Включает режим многопоточности

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

В результате оптимизации кода в C3D Toolkit 2016 были расширены возможности по использованию многопоточности при работе с геометрическими объектами – кривыми и поверхностями. Дополнительно обеспечено потокобезопасное использование любых константных методов, а также методов, принимающих константный параметр для всех классов. Ведутся работы в области обеспечения корректного потокового доступа к топологическим объектам и классам, которые содержат подобные объекты (MbFaceShell, MbFace, MbOrientedEdge, MbCurveEdge, MbSolid…). Уже сейчас для них потокобезопасен и доступен отдельный функционал, например, построение проекций вида ::GetVestiges (…).

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

Разберём, какие параметры могут принимать одни и те же объекты в разных потоках на примере многопоточного построения проекций вида ::GetVestiges (…):

  • MATH_FUNC (void) GetVestiges ( const MbPlacement3D & place,
  • double znear,
  • const RPArray & lumps,
  • const MbProjectionsObjects & objects,
  • MbVEFVestiges & result
  • const MbMapVisibilityMode & visMode,
  • VERSION version = Math::DefaultMathVersion(),
  • bool merge = true );


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

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

  • void BetaMultithreaded0()
  • {
  • < … >
  • < собираем массив проецируемых тел lumps >
  • < задаём плэйсменты, определяющие направление проецирования places (в тестовом приложении это: вид сверху, фронтальный, слева и изометрия) >
  • < задаём параметры проецирования: перспектива znear и видимость visMode >

  • /// Создаём 4 массива следов по количеству направлений проецирования, так как в ::GetVestiges (...)
  • int count = (int)places.Count();
  • PArrayvestigesArray(count,1);
  • for( int m = 0; m < count; m++ )
  • vestigesArray.Add( new MbVEFVestiges() );

  • /// Устанавливаем максимальный уровень многопоточности
  • MbeMultithreadedMode mode = Math::MultithreadedMode();
  • Math::SetMultithreadedMode( mtm_Max );

  • /// Осуществляем многопоточное проецирование
  • #pragma omp parallel for shared( znear, places, lumps, vestigesArray, visMode ) num_threads
  • (count) if( Math::CheckMultithreadedMode(mtm_Max) )
  • for( int m = 0; m < count; m++ )
  • {
  • MbProjectionsObjects prObjects;
  • ::GetVestiges( places[m], znear, lumps, prObjects, *vestigesArray[m], visMode, Math::DefaultMathVersion() );
  • }

  • /// Восстанавливаем уровень многопоточности
  • Math::SetMultithreadedMode( mode );

  • < Используем полученные следы >
  • }

Рисунок 2. Результат оптимизации кода в C3D Toolkit 2016 при проецировании 100 и 1000 точек на произвольную NURBS-поверхность


Подробнее о технологиях C3D читайте в специальном разделе на сайте C3D Labs:
http://c3dlabs.com/ru/products/c3d-kernel/

Взять ядро C3D на тестирование:
http://c3dlabs.com/ru/evaluation/


О компании C3D Labs
C3D Labs — дочерняя компания группы АСКОН, работает на наукоемком рынке PLM-компонентов. Компания создаёт и продвигает программные модули для разработки инженерного ПО, в частности, ядро геометрического моделирования C3D, лежащее в основе популярной системы трехмерного моделирования КОМПАС-3D. В 2013 году C3D Labs получила статус резидента инновационного центра Сколково. На сегодняшний день пользователями программных компонентов C3D Toolkit являются многие разработчики САПР и учебные заведения в России и за рубежом.


Контакты
E-mail: info@c3dlabs.com
Тел.: +7 (495) 783-2560, доб. 2130
127106, Россия, Москва,
Алтуфьевское шоссе, д. 1.
Бета-Центр, офис 112


Все права защищены. © 2004-2024 Группа компаний «ЛЕДАС»

Перепечатка материалов сайта допускается с согласия редакции, ссылка на isicad.ru обязательна.
Вы можете обратиться к нам по адресу info@isicad.ru.