Intel Threading Building Blocks

Intel Threading Building Blocks (также известная как TBB) — кроссплатформенная библиотека шаблонов C++, разработанная компанией Intel для параллельного программирования. Библиотека содержит алгоритмы и структуры данных, позволяющие программисту избежать многих сложностей, возникающих при использовании традиционных реализаций потоков, таких как POSIX Threads, Windows threads или Boost Threads, в которых создаются отдельные потоки исполнения, синхронизируемые и останавливаемые вручную. Библиотека TBB абстрагирует доступ к отдельным потокам. Все операции трактуются как «задачи», которые динамически распределяются между ядрами процессора. Кроме того, достигается эффективное использование кэша. Программа, написанная с использованием TBB, создаёт, синхронизирует и разрешает графы зависимостей задач в соответствии с алгоритмом. Затем задачи исполняются в соответствии с зависимостями. Этот подход позволяет программировать параллельные алгоритмы на высоком уровне, абстрагируясь от деталей архитектуры конкретной машины.

Структура библиотеки 

Библиотека является коллекцией шаблонов классов и функций для параллельного программирования. В библиотеке реализованы:

 параллельные алгоритмы: for, reduce, do, scan, while, pipeline, sort;
 потокобезопасные контейнеры: вектор, очередь, хеш-таблица;
 масштабируемые распределители памяти;
 мьютексы;
 атомарные операции;
 глобальная временная метка;
 планировщик задач;
 вычислительный граф.

История 

Версия 1.0 была выпущена фирмой Интел 29 августа 2006, через год после выпуска своего первого двуядерного процессора Pentium D.

Версия 1.1 была выпущена 10 апреля 2007. 5 июня библиотека была добавлена в состав Intel C++ Compiler 10.0 Professional Edition.

Версия 2.0 была выпущена 24 июля 2007. Был открыт исходный код библиотеки и был создан проект с открытым исходным кодом с лицензией GPLv2. Библиотека также доступна под коммерческой лицензией без исходного кода, но с доступом к технической поддержке. Функциональность обеих библиотек одинакова.

Версия 2.1 была выпущена 22 июля 2008.

Версия 2.2 была выпущена 5 августа 2009 года. Она включает в себя поддержку лямбда-функций C++0x.

Версия 3.0 была выпущена 4 мая 2010 года. Список улучшений http://software.intel.com/en-us/blogs/2010/05/04/tbb-30-new-today-version-of-intel-threading-building-blocks/.

Версия 4.0 была выпущена 8 Сентября 2011 года. Была добавлен новая функциональность, см. https://web.archive.org/web/20111213150434/http://threadingbuildingblocks.org/whatsnew.php

Начиная с версии 3.0 промежуточные обновления TBB выходят в формате TBB X.0 update N, например TBB 4.0 update 2.

Примеры использования 

В этой программе элементы массива обрабатываются функцией Calculate параллельно.

// Подключаются необходимые загловочные файлы
#include “tbb/blocked_range.h”
#include “tbb/parallel_for.h”

// Количество элементов вектора
const int SIZE = 10000000;

// Класс-обработчик
class CalculationTask
{
	vector<double> &myArray;
public:
	// Оператор () выполняется над диапазоном из пространства итераций
	void operator()(const tbb::blocked_range<int> &r) const
	{
		for (int i = r.begin(); i != r.end(); i++)
			Calculate(myArray[i]);
	}

	// Конструктор
	CalculationTask (vector<double> &a) : myArray(a) { }
};

int main()
{
	vector<double> myArray(SIZE);

	// Запуск параллельного алгоритма for
	tbb::parallel_for(tbb::blocked_range<int>(0, SIZE), CalculationTask(myArray));

	return 0;
}
С использованием лямбда-функций из C++11:
// Подключаются необходимые заголовочные файлы
#include “tbb/blocked_range.h”
#include “tbb/parallel_for.h”

#include <vector>

// Количество элементов вектора
const size_t SIZE = 10000000;

int main()
{
	std::vector<double> myArray(SIZE);

	// Запуск параллельного алгоритма for
	tbb::parallel_for(tbb::blocked_range<size_t>(0, SIZE),
	// Лямбда-функция
	[&myArray](const tbb::blocked_range<size_t> &r)
	{
		for (size_t i = r.begin(); i != r.end(); i++)
			Calculate(myArray[i]);
	});

	return 0;
}

Поддерживаемые операционные системы 
Коммерческая версия TBB 4.0 поддерживает Windows (XP или выше), Mac OS X (версия 10.5.8 или выше) и Linux, используя различные компиляторы: Microsoft Visual C++ (версия 8.0 или выше, только на Windows), Intel C++ compiler (версия 11.1 или выше) или GNU Compiler Collection (gcc, версия 3.4 и выше). Кроме того, сообщество открытой версии TBB портировало её на Sun Solaris, PowerPC, Xbox 360, QNX Neutrino, и FreeBSD.

См. также 
 OpenMP
 Intel Cilk Plus
 Стандартная библиотека шаблонов
 Intel Parallel Studio
 Intel Software Network

Литература 

 Reinders, James (2007, July). Intel Threading Building Blocks: Outfitting C++ for Multi-core Processor Parallelism (Paperback) Sebastopol: O’Reilly Media, ISBN 978-0-596-51480-8.
 Voss, M. (2006, October). «Demystify Scalable Parallelism with Intel Threading Building Blocks' Generic Parallel Algorithms.»
 Voss, M. (2006, December). «Enable Safe, Scalable Parallelism with Intel Threading Building Blocks' Concurrent Containers.»
 Hudson, R. L., B. Saha, et al. (2006, June). «McRT-Malloc: a scalable transactional memory allocator.» Proceedings of the 2006 International Symposium on Memory Management. New York: ACM Press, pp. 74–83.
Voss, M., Asenjo, R, Reinders, J. (2019)  «Pro TBB. C++ Parallel Programming with Threading Building Blocks»

Примечания

Ссылки 
 http://www.threadingbuildingblocks.org — сайт сообщества.
 http://software.intel.com/ru-ru/articles/intel-tbb/ — описание библиотеки на русском сайте Интела.
 http://www.slideshare.net/michaelkarpov/tbb - презентация на русском языке.
 http://www.slideshare.net/yandex/ss-33845143 - параллелизм в C++ (обзорная презентация)

Библиотеки C++
Параллельные вычисления
 Intel
Библиотеки параллельного программирования