Сотрудничество 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();
- PArray
vestigesArray(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