Что нового? Intel® Threading Building Block 4.2

Одна из наиболее известных многопоточных  библиотек C++ Intel® Threading Building Blocks (Intel® TBB) была недавно обновлена на новую версию – 4.2. Обновленная версия содержит несколько важных нововведений по сравнению с версией 4.1. Некоторые из них уже стали доступны в обновлениях Intel TBB 4.1..

Новый примитив синхронизации speculative_spin_mutex обеспечивает поддержку спекулятивной блокировки. Это стало возможно благодаря использованию аппаратной функции Transactional Synchronization Extensions (Intel® TSX), доступной в процессорах Intel® Core™ четвертого поколения. В процессорах, поддерживающих транзакционную память (таких как Intel® TSX), спекулятивные мьютексы позволяют нескольким потокам занять одну блокировку, пока не появятся "конфликты", которые могут привести к результатам, отличным от неспекулятивной блокировки. Таким образом, последовательная обработка исключается в случаях, когда не возникает конфликтов. Это может значительно повысить производительность и масштабируемость для "коротких" и важных критических секций. Если нет аппаратной поддержки транзакционной памяти, спекулятивные мьютексы работают подобно своим неспекулятивным аналогам, но, вероятно, с худшей производительностью.

Intel TBB теперь поддерживает C++11 exception_ptr. Используя exception_ptr, объекты исключений могут безопасно копироваться между потоками. Это обеспечивает гибкость в обработке исключений в многопоточной среде. Сейчас использование exception_ptr доступно в бинарных файлах для всех платформ: OS X*, Windows* и Linux*. В системе OS X есть два набора бинарных файлов: первый слинкован со стандартной библиотекой gcc, которая используется по умолчанию и не поддерживает exception_ptr. Для использования этой функции вы должны применять второй набор двоичных файлов, связанных с libc++, стандартной библиотекой C++ в Clang. Для их использования нужно настроить переменные окружения и построить Intel TBB следующим образом:

$ tbbvars.sh libc++
$ clang++ -stdlib=libc++ -std=c++11 concurrent_code.cpp -ltbb

В дополнение к контейнерам concurrent_unordered_set и concurrent_unordered_map теперь добавлены concurrent_unordered_multiset и concurrent_unordered_multimap, основанные на прототипе Microsoft* PPL. Контейнер concurrent_unordered_multiset имеет возможность вставки элементов более одного раза, что невозможно в concurrent_unordered_set. Аналогично, concurrent_unordered_multimap позволяет вставлять более одной пары <ключ,значение> с одним значением ключа. Для обоих “мульти”-контейнеров функция поиска вернет первый элемент (или пару <ключ,значение>) в таблице с соответствующим значением ключа.

Контейнеры Intel Threading Building Blocks теперь можно удобно инициализировать списками значений, как это делается в C++ 11 (списки инициализации):

tbb::concurrent_vector<int> v ({1,2,3,4,5} );

В настоящее время списки инициализации поддерживаются следующими контейнерами:

concurrent_vector
concurrent_hash_map
concurrent_unordered_set
concurrent_unordered_multiset
concurrent_unordered_map
concurrent_unordered_multimap
concurrent_priority_queue

Аллокатор памяти Intel TBB (scalable memory allocator) имеет кэш для выделенной памяти в каждом потоке. Это делается ради производительности, но часто за счет увеличения использования памяти. Хотя аллокатор пытается избежать чрезмерного использования памяти, в сложных ситуациях Intel TBB 4.2 предлагает программистам больше контроля: теперь можно уменьшить использование памяти посредством очистки кэшей потоков с помощью функции scalable_allocation_command(). Также было сделано ещё несколько улучшений для повышения общей производительности аллокатора.

Intel TBB широко используется на различных платформах. Сейчас разработчики мобильных систем могут найти готовые бинарные модули для Android в пакете ОС Linux. В пакет ОС Windows были добавлены бинарные модули для приложений Windows Store.

Атомарные переменные tbb::atomic<T> теперь имеют конструкторы при использовании C++11. Это позволяет разработчикам инициализировать их значениями во время объявления, с поддержкой константных выражений (const expressions). В настоящее время это работает с компиляторами gcc и Clang:

tbb::atomic<int> v=5;

Новая экспериментальная функциональность (community preview feature) позволяет ожидать завершения всех потоков. Это может потребоваться, если приложений создаёт процессы или, если динамическая библиотека Intel TBB может быть выгружена во время выполнения (например, если библиотека является частью плагина). Для ожидания завершения потоков-обработчиков нужно инициализировать объект task_scheduler_init следующим образом:

#define TBB_PREVIEW_WAITING_FOR_WORKERS 1
tbb::task_scheduler_init scheduler_obj (threads, 0, /*wait_workers=*/true);

Обновлённую библиотеку Intel Threading Building Blocks 4.2 можно скачать на коммерческом сайте и на сайте open source сообщества. Загружайте и пользуйтесь новыми возможностями!

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