Подтвердить что ты не робот

Какие-либо опыты с Intel Threading Building Blocks?

Intel Threading Building Blocks (TBB) библиотека с открытым исходным кодом выглядит действительно интересной. Даже если есть даже O'Reilly Book о предмете, я не слышу о том, как много людей его используют. Я заинтересован в использовании его для нескольких многоуровневых параллельных приложений (MPI + threads) в средах Unix (Mac, Linux и т.д.). Для чего это стоит, меня интересуют высокопроизводительные вычислительные/численные методы видов приложений.

Есть ли у кого-нибудь опыт работы с TBB? Это хорошо работает? Достаточно ли он переносимый (включая GCC и другие компиляторы)? Хорошо ли работает парадигма для программ, которые вы написали? Есть ли другие библиотеки, на которые я должен смотреть?

4b9b3361

Ответ 1

Я ввел его в нашу базу кода, потому что нам нужно было использовать bettor malloc, когда мы перешли на 16-ядерную машину. С 8 и под ним не было существенной проблемы. Это хорошо сработало для нас. Затем мы планируем использовать мелкозернистые параллельные контейнеры. В идеале мы можем использовать реальное мясо продукта, но это требует переосмысления того, как мы строим наш код. Мне очень нравятся идеи в TBB, но это нелегко модифицировать на основе кода.

Вы не можете думать о TBB как о другой библиотеке потоков. У них есть совершенно новая модель, которая действительно сидит поверх потоков и абстрагирует нити. Вы научитесь думать в задаче, parallel_for операции типа и трубопроводы. Если бы я должен был построить новый проект, я бы, вероятно, попытался его моделировать таким образом.

Мы работаем в Visual Studio, и все работает отлично. Он был первоначально написан для linux/pthreads, поэтому он также отлично работает там.

Ответ 2

Я не занимаюсь численными вычислениями, но я работаю с интеллектуальным анализом данных (думаю, кластеризация и классификация), и наши рабочие нагрузки, вероятно, похожи: все данные являются статическими, и у вас есть это в начале программы. Я кратко исследовал Intel TBB и нашел их излишними для моих нужд. После запуска с исходным кодом на основе pthread я переключился на OPENMP и получил правильное сочетание между читабельностью и производительностью.

Ответ 3

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

Блоки Threading Building (TBB) в версии с открытым исходным кодом (есть новая коммерческая версия, 299 долларов США, еще не знаю различий) является GNU General Public License версии 2 с так называемым "Runtime Exception", (что характерно для использования только при создании бесплатного программного обеспечения.) Я видел другие исключения Runtime, которые пытаются приблизиться к LGPL, но для коммерческого использования и статической привязки этого не теперь.

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


Txs, Jihn для указания этого обновления...

Ответ 4

Я кратко использовал TBB и, вероятно, буду использовать его больше в будущем. Мне понравилось использовать его, самое главное, потому что вам не нужно иметь дело с макросами/расширениями С++, но они остаются в пределах языка. Также его довольно портативный. Я использовал его как в окнах, так и в linux. Одна вещь: трудная работа с потоками, использующая TBB, вам придется думать с точки зрения задач (что на самом деле хорошо). Intel TBB не будет поддерживать ваше использование голых замков (это сделает это утомительным). Но в целом это мой предварительный опыт.

Я также рекомендую взглянуть на openMP 3 тоже.

Ответ 5

Я изучил TBB, но никогда не использовал его в проекте. Я не видел преимуществ (для моих целей) над ZThread. Краткий и несколько датированный обзор можно найти здесь.

Он достаточно дополнен несколькими вариантами отправки потоков, всеми обычными классами синхронизации и очень удобным механизмом прерывания на основе исключений. Он легко расширяется, хорошо написан и документирован. Я использовал его в 20 проектах. Он также отлично работает с любым * NIX, который поддерживает потоки POSIX, а также Windows.

Стоит посмотреть.

Ответ 6

Я использую TBB в одном проекте. Казалось, что проще использовать его, чем потоки. Есть задачи, которые можно запускать параллельно. Задача - это просто вызов вашей параллельной подпрограммы. Балансировка нагрузки выполняется автоматически. Вот почему я принимаю его как библиотеку распараллеливания более высокого уровня. Я добился 2,5-кратной скорости без большой работы с 4-ядерным процессором Intel. Есть примеры, они отвечают на вопросы на форумах и поддерживаются, и это бесплатно.

Ответ 7

Портативность

TBB переносима. Он поддерживает процессоры Intel и AMD (например, x86), процессоры IBM PowerPC и POWER, процессоры ARM и, возможно, другие. Если вы посмотрите в каталоге build, вы увидите все конфигурации поддержки системы сборки, которые включают в себя широкий спектр операционных систем (Linux, Windows, Android, MacOS, iOS, FreeBSD, AIX и т.д.) И компиляторы (GCC, Intel, Clang/LLVM, IBM XL и т.д.). Я не пробовал TBB с компилятором PGI С++ и знаю, что он не работает с компилятором Cray С++ (по состоянию на 2017 год).

Несколько лет назад я был частью усилий по подключению TBB к системам IBM Blue Gene. Статическая связь была сложной задачей, но теперь она обращается с помощью big_iron.inc. Другие вопросы поддерживали относительно древние версии GCC (4.1 и 4.4) и обеспечивали работу атома PowerPC. Я ожидаю, что перенос на любую неподдерживаемую архитектуру будет относительно прост на платформах, которые обеспечивают или совместимы с GCC и POSIX.

Использование в коде сообщества

Я знаю, по крайней мере, две платформы приложений HPC, которые используют TBB:

Я не знаю, как MOOSE использует TBB, но MADNESS использует TBB для своей очереди задач и распределителя памяти.

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

Я лично использовал TBB в проекте Parallel Research Nerners, в рамках которого я сравнил TBB с OpenMP, OpenCL, Kokkos, RAJA, С++ 17 Параллельный STL и другие модели. Подробнее см. подкаталог С++.

На следующем рисунке показана относительная производительность вышеупомянутых моделей на процессоре Intel Xeon Phi 7250 (подробности не важны - все модели использовали одни и те же настройки). Как вы можете видеть, TBB отлично справляется, за исключением меньших размеров проблем, где накладные расходы на адаптивное планирование более актуальны. TBB имеет регуляторы настройки, которые повлияют на эти результаты.

PRK трафарет

Полное раскрытие: я работаю для Intel в области исследований/возможностей поиска путей.

Ответ 8

Вы просмотрели библиотеку boost с ее thread API?

Ответ 9

Блоки Threading Building (TBB) в версия с открытым исходным кодом (есть новая коммерческая версия, $299, не знаю различия) GNU Общая публичная лицензия версии 2 с так называемое "исключение времени выполнения" ( специфично для использования только на создание бесплатного программного обеспечения.) Я видел другие Runtime Исключения, которые пытаются подходить к LGPL, но коммерческое использование и статическое связывание этого это не так.

В соответствии с этим question поточные строительные блоки можно использовать без ограничений по копированию с использованием в коммерческих целях.

Ответ 10

Стоит понять, какие TBB (Threading Building Blocks) предназначены для сравнения с другими альтернативами (например, С++ 11x concurrency). TBB - это портативная и масштабируемая библиотека (а не расширение компилятора), позволяющая вам писать свой код в виде легких задач, которые TBB планирует планировать как можно быстрее на доступных ресурсах ЦП. Он не предназначен для поддержки резьбы для других целей (например, для превенции).

Я использовал TBB для ускорения обработки существующих изображений для циклов по линиям сканирования изображений в параллельные петли (минимум 2-4 строки сканирования в виде "зерна" ). Это было очень успешно. Для этого требуется, чтобы ваше тело цикла (re) записывалось для обработки произвольного индекса, а не для предположения, что каждый объект цикла обрабатывается последовательно (например, указатели, которые увеличиваются между каждой итерацией цикла).

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

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