30.09.2016

Параллельное измерение C3D Labs и сотрудничество с Intel

Технологии C3D оптимизированы под архитектуру многоядерных процессоров

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

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

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


Многопоточное проецирование в C3D Toolkit 2016
Многопоточное проецирование в 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» в разных направлениях:

  1. void BetaMultithreaded0()
  2. {
  3.  
  4. <>
  5. < Собираем массив проецируемых тел lumps >
  6. < Задаём плэйсменты, определяющие направление проецирования places > < (в тестовом приложении это: вид сверху, фронтальный, слева и изометрия) >
  7. < Задаём параметры проецирования: перспектива znear и видимость visMode >
  8.  
  9. /// Создаём 4 массива следов по количеству направлений проецирования, так как в ::GetVestiges (...)
  10. int count = (int)places.Count();
  11. PArray<MbVEFVestiges>vestigesArray(count,1);
  12. for( int m = 0; m < count; m++ )
  13. vestigesArray.Add( new MbVEFVestiges() );
  14.  
  15. /// Устанавливаем максимальный уровень многопоточности
  16. MbeMultithreadedMode mode = Math::MultithreadedMode();
  17. Math::SetMultithreadedMode( mtm_Max );
  18.  
  19. /// Осуществляем многопоточное проецирование
  20. # pragma omp parallel for shared( znear, places, lumps, vestigesArray, visMode ) num_threads (count) if( Math::CheckMultithreadedMode(mtm_Max) )
  21. for( int m = 0; m < count; m++ )
  22. {
  23. MbProjectionsObjects prObjects;
  24. ::GetVestiges( places[m], znear, lumps, prObjects, *vestigesArray[m], visMode, Math::DefaultMathVersion() );
  25. }
  26.  
  27. /// Восстанавливаем уровень многопоточности
  28. Math::SetMultithreadedMode( mode );
  29.  
  30. < Используем полученные следы >
  31. }

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

Взять ядро на тестирование

О компании C3D Labs

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

О конференции Intel Software Conference 2016

Intel Software Conference 2016 — это ежегодная конференция, посвященная инновационным моделям программирования и реализующим их инструментам разработки корпорации Intel.

Конференция ориентирована на профессионалов в области разработки ПО, специалистов по тестированию, архитекторов, руководителей групп разработки, ведущих преподавателей и научных сотрудников, а также экспертов и руководителей ИТ-индустрии.

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


Google+