SlideShare uma empresa Scribd logo
1 de 167
Библиотека  Intel Threading Building Blocks  –  краткое описание Инструменты параллельного программирования для систем с общей памятью Мееров И.Б. ,  Сысоев А.В., Сиднев А.А. Кафедра математического обеспечения ЭВМ
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Содержание… Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Содержание Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Введение ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Назначение библиотеки ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Возможности библиотеки… ,[object Object],[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Возможности библиотеки ,[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Описание библиотеки  ,[object Object],[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Инициализация и завершение библиотеки… ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Инициализация и завершение библиотеки… ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Инициализация и завершение библиотеки… ,[object Object],[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание task_scheduler_init(int number_of_threads = automatic);
Инициализация и завершение библиотеки. Автоматическое определение числа потоков ,[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание task_scheduler_init init; //  Инициализация объекта   //  класса  tbb::task_scheduler_init // по умолчанию при создании объекта
Инициализация и завершение библиотеки. Ручное задание числа потоков ,[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание task _ scheduler _ init init (3); // Инициализация объекта класса // tbb::task_scheduler_init c  тремя // потоками при создании объекта
Инициализация и завершение библиотеки. Отложенная инициализация ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание void initialize(int number_of_threads = automatic); task_scheduler_init init(task_scheduler_init::deferred);  init.initialize(3);  //  Инициализация объекта класса // tbb::task_scheduler_init c  //  тремя потоками
Инициализация и завершение библиотеки. Завершение работы… ,[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Инициализация и завершение библиотеки. Завершение работы ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание void terminate();
Инициализация и завершение библиотеки ,[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Инициализация и завершение библиотеки. Типичная схема ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание # include  " tbb / task _ scheduler _ init . h "  using namespace tbb ;    int main() {  task_scheduler_init init; // Вычисления return  0;  }
Инициализация и завершение библиотеки. Усложнённая схема ,[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание include "tbb/task_scheduler_init.h"  using namespace tbb;    int main() {  task _ scheduler _ init init ; // Инициализация по умолчанию //Вычисления 1 init . terminate ();  // Деинициализация init . initialize (4);  // Инициализация с 4-мя потоками //Вычисления 2 return 0;  }       // Деинициализация при уничтожении  // (вызов деструктора) объекта init
Н.Новгород, 2009 г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Распараллеливание циклов с известным числом повторений ,[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание template<typename Range, typename Body> void parallel_for(const Range& range, const Body& body);
Распараллеливание циклов с известным числом повторений ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание template<typename Range, typename Body> void parallel_for(const Range& range, const Body& body);
Пример. Матрично-векторное умножение Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Пример.  OpenMP  реализация ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание double VectorsMultiplication(double *v1, double *v2, int size) { double result=0; for(int i=0; i<size; i++) result += v1[i] * v2[i]; return result; } void OpenMPMatrixVectorMultiplication(double* matrix,  double* vector, double* resultVector, int rows, int columns)  { #pragma omp parallel for for(int i=0; i<rows; i++) resultVector[i] =  VectorsMultiplication(&(matrix[i*columns]), vector, columns); }
Пример.  TBB  реализация… ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание void TBBMatrixVectorMultiplication(double* matrix,  double* vector, double* resultVector, int rows, int columns, int grainSize)  { parallel_for(blocked_range<int>(0, rows, grainSize),  VectorsMultiplicator(matrix, vector, resultVector, columns) ); } void OpenMPMatrixVectorMultiplication(double* matrix,  double* vector, double* resultVector, int rows, int columns)  { #pragma omp parallel for for(int i=0; i<rows; i++) resultVector[i] =  VectorsMultiplication(&(matrix[i*columns]), vector, columns); }
Пример.  TBB  реализация… ,[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание class VectorsMultiplicator  {  const double *matrix,  *vector; double *const resultVector;  int const columns; public:  VectorsMultiplicator(double *tmatrix, double *tvector,  double *tresultVector, int tcolumns) : matrix(tmatrix),   vector(tvector), resultVector(tresultVector),   columns(tcolumns)  {}  void operator()( const blocked_range<int>& r ) const  {  int begin=r.begin(),  end=r.end(); for( int i=begin; i!=end; i++ )  resultVector[i] = VectorsMultiplication(&(matrix[i*columns]), vector, columns); }  };
Итерационное пространство ,[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Одномерное итерационное пространство ,[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Одномерное итерационное пространство ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Одномерное итерационное пространство ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание blocked _ range :: blocked _ range ( Value    begin ,  Value end ,    size _ t grainsize  = 1);
Одномерное итерационное пространство . Расщепление ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Одномерное итерационное пространство . Расщепление. Пример ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание blocked_range<int> a(5, 14, 2); blocked_range<int> b(a, split()   );
Одномерное итерационное пространство. Пример ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание blocked_range<int> range(0, 100); for (int i = range.begin(); i != range.end(); i++) { //Вычисления } for  ( int i  = 0;  i  != 100;  i ++) { //Вычисления }
Пользовательское итерационное пространство … ,[object Object],[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Пользовательское итерационное пространство ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание namespace tbb {  class split { };  }
Пользовательское итерационное пространство . Пример … ,[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание class SimpleRange  { private: int my_begin; int my_end; public: int begin() const { return my_begin; } int end() const { return my_end; } bool empty() const { return my_begin == my_end; } bool is_divisible() const { return my_end > my_begin + 1; }   SimpleRange(int begin, int end): my_begin(begin), my_end(end) {} SimpleRange(SimpleRange& r, split ) { int medium = (r.my_begin + r.my_end) / 2; my_begin = medium; my_end = r.my_end; r.my_end = medium; } };
Пользовательское итерационное пространство . Пример ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Функтор ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание template<typename Range, typename Body> void parallel_for(const Range& range, const Body& body);
Функтор ,[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание void operator()(Range& range) const
Функтор ,[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Функтор. Пример… ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание //Скалярное умножение векторов double VectorsMultiplication(const double *a, const double *b,  int size) { double result = 0.0; for(int i = 0; i < size; i++) result += a[i] * b[i]; return result; }
Функтор. Пример Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание class VectorsMultiplicator   // Функтор {  const double  * matrix , * vector ;  // Исходные данные для умножения double  * const resultVector ;  // Вектор результатов int const  numOf Columns ;  // Количество столбцов матрицы public:  VectorsMultiplicator(double *tmatrix, double *tvector,  double *tresultVector,   int tnumOfColumns) : matrix(tmatrix),  vector(tvector),   resultVector(tresultVector),  numOf Columns(t numOf Columns) {}    void operator()(const blocked_range<int>& r) const {  int begin = r.begin(),  end = r.end(); for (int i = begin; i != end; i++) resultVector[i] = VectorsMultiplication(&(matrix[i * numOfColumns]), vector , numOf Columns ); }  };
Планирование вычислений ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Планирование вычислений при использовании одномерного итерационного пространства ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Планирование вычислений при использовании одномерного итерационного пространства ,[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Выбор размера порции вычислений… ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Выбор размера порции вычислений… ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Выбор размера порции вычислений ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Алгоритм экспериментального подбора размера порции вычислений… ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Алгоритм экспериментального подбора размера порции вычислений ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Пример работы функции tbb::parallel_for ,[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание parallel_for(blocked_range<int>(5, 14, 2), body);
Пример работы функции tbb::parallel_for ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Пример параллельной обработки… ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Пример параллельной обработки ,[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Пример использования функции tbb::parallel_for ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание parallel_for(blocked_range<int>(0, numOfRows, grainSize), VectorsMultiplicator(matrix, vector,  resultVector, numOfColumns)); #pragma omp parallel for schedule(dynamic, grainsize) for(int i = 0; i < numOfRows; i++) resultVector[i] =  VectorsMultiplication(&(matrix[i*columns]),  vector, numOfColumns);
Н.Новгород, 2009 г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Редукция ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Распараллеливание циклов с редукцией ,[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание template<typename Range, typename Body>  void parallel_reduce(const Range& range, Body& body);
Распараллеливание циклов с редукцией ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание template<typename Range, typename Body>  void parallel_reduce(const Range& range, Body& body);
Функтор для функции  parallel_reduce   ,[object Object],[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание Body(body&, split) ~Body() ,[object Object],[object Object]
Функтор для функции  parallel_reduce . Метод, выполняющий вычисления ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание void operator ()( Range &  range )
Функтор для функции  parallel_reduce . Метод, выполняющий редукцию ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание void join(Body& rhs)
Алгоритм работы  parallel_reduce ,[object Object],[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Алгоритм работы  parallel_reduce . Пример… ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание parallel_reduce(blocked_range<int>(5, 14, 2), body);
Алгоритм работы  parallel_reduce . Пример… ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание parallel_reduce(blocked_range<int>(5, 14, 2), body);
Алгоритм работы  parallel_reduce . Пример… ,[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание parallel_reduce(blocked_range<int>(5, 14, 2), body);
Алгоритм работы  parallel_reduce . Пример ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание parallel_reduce(blocked_range<int>(5, 14, 2), body);
Пример параллельной обработки… ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Пример параллельной обработки ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Алгоритм работы  parallel_reduce . Расщепление функтора ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Алгоритм работы  parallel_reduce . Редукция ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Пример параллельной обработки… Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание ,[object Object]
Пример параллельной обработки… Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание ,[object Object]
Пример использования функции tbb:: parallel_reduce … ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание //Скалярное умножение векторов double VectorsMultiplication(double *v1, double *v2, int size) { double result = 0; for (int i = 0; i < size; i++) result += v1[i] * v2[i]; return result; }
Пример использования функции tbb:: parallel_reduce . Реализация функтора… Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание class ScalarMultiplicator //Функтор {  private: const double *a, *b; double c;    public:  explicit ScalarMultiplicator(double *ta, double *tb):  a(ta), b(tb), c(0) {}    ScalarMultiplicator(const ScalarMultiplicator& m, split):  a(m.a), b(m.b), c(0) {} //…  };
Пример использования функции tbb:: parallel_reduce . Реализация функтора Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание class ScalarMultiplicator   //Функтор {  //… public:  void operator()(const blocked_range<int>& r) {  int begin = r.begin(), end = r.end(); c += VectorsMultiplication(&(a[begin]), &(b[begin]), end - begin); }    void join(const ScalarMultiplicator& multiplicator) { c += multiplicator.c; }   double Result() { return c; } };
Пример использования функции tbb:: parallel_reduce ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание ScalarMultiplicator s(a, b); parallel_reduce(blocked_range<int>(0, size, grainSize),  s);  #pragma omp parallel for schedule(dynamic, grainsize) reduce(+: c) for (int i = 0; i < size / grainsize; i++) c += VectorsMultiplication(&(a[i * grainsize]),  &(b[i * grainsize]), grainsize);
Н.Новгород, 2009 г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Параллельная сортировка ,[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Параллельная сортировка. Пример ,[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание #include &quot;tbb/parallel_sort.h&quot; #include <math.h> using namespace tbb; const int N = 100000; float a[N]; float b[N];   void SortExample() { for ( int i = 0; i < N; i++ ) { a[i] = sin((double)i); b[i] = cos((double)i); } parallel_sort(a, a + N); parallel_sort(b, b + N, std::greater<float>()); }
Распараллеливание циклов с условием ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Класс обрабатываемых элементов ,[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Поток данных ,[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание bool S::pop_if_present( B::arguelement_type& item )
Класс обрабатывающий элементы ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание B::operator()(B::element_type& item) const typedef element_type argument_type;
Конвейерные вычисления ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Класс  tbb ::pipeline ,[object Object],[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Фильтр ,[object Object],[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Н.Новгород, 2009 г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Ядро библиотеки ,[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Логическая задача… ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Логическая задача ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание task* task::execute()
Пустая задача ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание class empty_task: public task { task* execute() { return NULL; } };
Алгоритм работы ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Алгоритм работы. Пример… ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Алгоритм работы. Пример… ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Алгоритм работы. Пример… ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Алгоритм работы. Пример ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Атрибуты задачи ,[object Object],[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Алгоритм выполнения логической задачи ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Создание и уничтожение логических задач… ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Создание и уничтожение логических задач ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Создание и уничтожение логических задач. Пример ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание task* MyTask::execute() {  // ... MyTask &t = *new (allocate_child()) MyTask(); // ... } void task::destroy(task& victim)
Состояние логической задачи… ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание state_type task::state()
Состояние логической задачи ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Контейнер задач ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Планирование выполнения задач.. ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Планирование выполнения задач.. ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание task *  MyTask :: execute () {  // ... MyTask &t = *new (allocate_child()) MyTask(); set_ref_count(ref_count() + 2); spawn(t); wait_for_all(); //  ... }
Планирование выполнения задач.. ,[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Планирование выполнения задач.. ,[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание
Планирование выполнения задач.. ,[object Object],[object Object],[object Object],[object Object],Н.Новгород, 200 9  г. Инструменты параллельного программирования для систем с общей памятью.  TBB . Краткое описание int main {  //... MyTask &t = *new (task::allocate_root()) MyTask(); task::spawn_root_and_wait(t); // ... }
Повторное использование задач… ,[object Object]
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание
Tbb   описание

Mais conteúdo relacionado

Semelhante a Tbb описание

C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 
C# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееC# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееGetDev.NET
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)Pavel Tsukanov
 
библиотеки программирования
библиотеки программированиябиблиотеки программирования
библиотеки программированияmcroitor
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7Technopark
 
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryИнтервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryTatyanazaxarova
 
Дмитрий Кручинин - Сравнительный анализ библиотек глубинного обучения
Дмитрий Кручинин - Сравнительный анализ библиотек глубинного обученияДмитрий Кручинин - Сравнительный анализ библиотек глубинного обучения
Дмитрий Кручинин - Сравнительный анализ библиотек глубинного обученияAIST
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
 
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...Tatyanazaxarova
 
C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.Igor Shkulipa
 
2011 09-arm-bibliografa
2011 09-arm-bibliografa2011 09-arm-bibliografa
2011 09-arm-bibliografaPDA Ekniga
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language RuntimeSQALab
 
Evgeny Rybak Presentation
Evgeny Rybak PresentationEvgeny Rybak Presentation
Evgeny Rybak Presentationsef2009
 
Lecture1: Introduction to Parallel Computing
Lecture1: Introduction to  Parallel ComputingLecture1: Introduction to  Parallel Computing
Lecture1: Introduction to Parallel ComputingAndrii Rodionov
 
Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Alexander Syrotenko
 

Semelhante a Tbb описание (20)

C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
C# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееC# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущее
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
 
библиотеки программирования
библиотеки программированиябиблиотеки программирования
библиотеки программирования
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7
 
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryИнтервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
 
Дмитрий Кручинин - Сравнительный анализ библиотек глубинного обучения
Дмитрий Кручинин - Сравнительный анализ библиотек глубинного обученияДмитрий Кручинин - Сравнительный анализ библиотек глубинного обучения
Дмитрий Кручинин - Сравнительный анализ библиотек глубинного обучения
 
лек11 5
лек11 5лек11 5
лек11 5
 
лек11 5
лек11 5лек11 5
лек11 5
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
 
Tbb лр1
Tbb   лр1Tbb   лр1
Tbb лр1
 
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...
 
C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.
 
2011 09-arm-bibliografa
2011 09-arm-bibliografa2011 09-arm-bibliografa
2011 09-arm-bibliografa
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
 
Evgeny Rybak Presentation
Evgeny Rybak PresentationEvgeny Rybak Presentation
Evgeny Rybak Presentation
 
Lecture1: Introduction to Parallel Computing
Lecture1: Introduction to  Parallel ComputingLecture1: Introduction to  Parallel Computing
Lecture1: Introduction to Parallel Computing
 
Интегрированная среда разработки для функционального языка Refal
Интегрированная среда разработки для функционального языка RefalИнтегрированная среда разработки для функционального языка Refal
Интегрированная среда разработки для функционального языка Refal
 
Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?
 
Catalyst and Rose::DB
Catalyst and Rose::DBCatalyst and Rose::DB
Catalyst and Rose::DB
 

Mais de Michael Karpov

EdCrunch 2018 - Skyeng - EdTech product scaling: How to influence key growth ...
EdCrunch 2018 - Skyeng - EdTech product scaling: How to influence key growth ...EdCrunch 2018 - Skyeng - EdTech product scaling: How to influence key growth ...
EdCrunch 2018 - Skyeng - EdTech product scaling: How to influence key growth ...Michael Karpov
 
Movement to business goals: Data, Team, Users (4C Conference)
Movement to business goals: Data, Team, Users (4C Conference)Movement to business goals: Data, Team, Users (4C Conference)
Movement to business goals: Data, Team, Users (4C Conference)Michael Karpov
 
Save Africa: NASA hackathon 2016
Save Africa: NASA hackathon 2016 Save Africa: NASA hackathon 2016
Save Africa: NASA hackathon 2016 Michael Karpov
 
Из третьего мира - в первый: ошибки в развивающихся продуктах (AgileDays 2014)
Из третьего мира - в первый: ошибки в развивающихся продуктах (AgileDays 2014) Из третьего мира - в первый: ошибки в развивающихся продуктах (AgileDays 2014)
Из третьего мира - в первый: ошибки в развивающихся продуктах (AgileDays 2014) Michael Karpov
 
Один день из жизни менеджера. Тактика: хорошие практики, скрытые опасности и ...
Один день из жизни менеджера. Тактика: хорошие практики, скрытые опасности и ...Один день из жизни менеджера. Тактика: хорошие практики, скрытые опасности и ...
Один день из жизни менеджера. Тактика: хорошие практики, скрытые опасности и ...Michael Karpov
 
Поговорим про ошибки (Sumit)
Поговорим про ошибки (Sumit)Поговорим про ошибки (Sumit)
Поговорим про ошибки (Sumit)Michael Karpov
 
(2niversity) проектная работа tips&tricks
(2niversity) проектная работа   tips&tricks(2niversity) проектная работа   tips&tricks
(2niversity) проектная работа tips&tricksMichael Karpov
 
"Пользователи: сигнал из космоса". CodeFest mini 2012
"Пользователи: сигнал из космоса". CodeFest mini 2012"Пользователи: сигнал из космоса". CodeFest mini 2012
"Пользователи: сигнал из космоса". CodeFest mini 2012Michael Karpov
 
(Analyst days2012) Как мы готовим продукты - вклад аналитиков
(Analyst days2012) Как мы готовим продукты - вклад аналитиков(Analyst days2012) Как мы готовим продукты - вклад аналитиков
(Analyst days2012) Как мы готовим продукты - вклад аналитиковMichael Karpov
 
Как сделать команде приятное - Михаил Карпов (Яндекс)
Как сделать команде приятное - Михаил Карпов (Яндекс)Как сделать команде приятное - Михаил Карпов (Яндекс)
Как сделать команде приятное - Михаил Карпов (Яндекс)Michael Karpov
 
Как мы готовим продукты
Как мы готовим продуктыКак мы готовим продукты
Как мы готовим продуктыMichael Karpov
 
Hpc Visualization with WebGL
Hpc Visualization with WebGLHpc Visualization with WebGL
Hpc Visualization with WebGLMichael Karpov
 
Hpc Visualization with X3D (Michail Karpov)
Hpc Visualization with X3D (Michail Karpov)Hpc Visualization with X3D (Michail Karpov)
Hpc Visualization with X3D (Michail Karpov)Michael Karpov
 
сбор требований с помощью Innovation games
сбор требований с помощью Innovation gamesсбор требований с помощью Innovation games
сбор требований с помощью Innovation gamesMichael Karpov
 
Зачем нам Это? или Как продать agile команде
Зачем нам Это? или Как продать agile командеЗачем нам Это? или Как продать agile команде
Зачем нам Это? или Как продать agile командеMichael Karpov
 
"Зачем нам Это?" или как продать Agile команде
"Зачем нам Это?" или как продать Agile команде"Зачем нам Это?" или как продать Agile команде
"Зачем нам Это?" или как продать Agile командеMichael Karpov
 
"Зачем нам Это?" или как продать Agile команде
"Зачем нам Это?" или как продать Agile команде"Зачем нам Это?" или как продать Agile команде
"Зачем нам Это?" или как продать Agile командеMichael Karpov
 
Высоконагруженая команда - AgileDays 2010
Высоконагруженая команда - AgileDays 2010Высоконагруженая команда - AgileDays 2010
Высоконагруженая команда - AgileDays 2010Michael Karpov
 

Mais de Michael Karpov (20)

EdCrunch 2018 - Skyeng - EdTech product scaling: How to influence key growth ...
EdCrunch 2018 - Skyeng - EdTech product scaling: How to influence key growth ...EdCrunch 2018 - Skyeng - EdTech product scaling: How to influence key growth ...
EdCrunch 2018 - Skyeng - EdTech product scaling: How to influence key growth ...
 
Movement to business goals: Data, Team, Users (4C Conference)
Movement to business goals: Data, Team, Users (4C Conference)Movement to business goals: Data, Team, Users (4C Conference)
Movement to business goals: Data, Team, Users (4C Conference)
 
Save Africa: NASA hackathon 2016
Save Africa: NASA hackathon 2016 Save Africa: NASA hackathon 2016
Save Africa: NASA hackathon 2016
 
Из третьего мира - в первый: ошибки в развивающихся продуктах (AgileDays 2014)
Из третьего мира - в первый: ошибки в развивающихся продуктах (AgileDays 2014) Из третьего мира - в первый: ошибки в развивающихся продуктах (AgileDays 2014)
Из третьего мира - в первый: ошибки в развивающихся продуктах (AgileDays 2014)
 
Один день из жизни менеджера. Тактика: хорошие практики, скрытые опасности и ...
Один день из жизни менеджера. Тактика: хорошие практики, скрытые опасности и ...Один день из жизни менеджера. Тактика: хорошие практики, скрытые опасности и ...
Один день из жизни менеджера. Тактика: хорошие практики, скрытые опасности и ...
 
Поговорим про ошибки (Sumit)
Поговорим про ошибки (Sumit)Поговорим про ошибки (Sumit)
Поговорим про ошибки (Sumit)
 
(2niversity) проектная работа tips&tricks
(2niversity) проектная работа   tips&tricks(2niversity) проектная работа   tips&tricks
(2niversity) проектная работа tips&tricks
 
"Пользователи: сигнал из космоса". CodeFest mini 2012
"Пользователи: сигнал из космоса". CodeFest mini 2012"Пользователи: сигнал из космоса". CodeFest mini 2012
"Пользователи: сигнал из космоса". CodeFest mini 2012
 
(Analyst days2012) Как мы готовим продукты - вклад аналитиков
(Analyst days2012) Как мы готовим продукты - вклад аналитиков(Analyst days2012) Как мы готовим продукты - вклад аналитиков
(Analyst days2012) Как мы готовим продукты - вклад аналитиков
 
Как сделать команде приятное - Михаил Карпов (Яндекс)
Как сделать команде приятное - Михаил Карпов (Яндекс)Как сделать команде приятное - Михаил Карпов (Яндекс)
Как сделать команде приятное - Михаил Карпов (Яндекс)
 
Как мы готовим продукты
Как мы готовим продуктыКак мы готовим продукты
Как мы готовим продукты
 
Hpc Visualization with WebGL
Hpc Visualization with WebGLHpc Visualization with WebGL
Hpc Visualization with WebGL
 
Hpc Visualization with X3D (Michail Karpov)
Hpc Visualization with X3D (Michail Karpov)Hpc Visualization with X3D (Michail Karpov)
Hpc Visualization with X3D (Michail Karpov)
 
сбор требований с помощью Innovation games
сбор требований с помощью Innovation gamesсбор требований с помощью Innovation games
сбор требований с помощью Innovation games
 
Зачем нам Это? или Как продать agile команде
Зачем нам Это? или Как продать agile командеЗачем нам Это? или Как продать agile команде
Зачем нам Это? или Как продать agile команде
 
"Зачем нам Это?" или как продать Agile команде
"Зачем нам Это?" или как продать Agile команде"Зачем нам Это?" или как продать Agile команде
"Зачем нам Это?" или как продать Agile команде
 
"Зачем нам Это?" или как продать Agile команде
"Зачем нам Это?" или как продать Agile команде"Зачем нам Это?" или как продать Agile команде
"Зачем нам Это?" или как продать Agile команде
 
HPC Visualization
HPC VisualizationHPC Visualization
HPC Visualization
 
Hpc Visualization
Hpc VisualizationHpc Visualization
Hpc Visualization
 
Высоконагруженая команда - AgileDays 2010
Высоконагруженая команда - AgileDays 2010Высоконагруженая команда - AgileDays 2010
Высоконагруженая команда - AgileDays 2010
 

Tbb описание

  • 1. Библиотека Intel Threading Building Blocks – краткое описание Инструменты параллельного программирования для систем с общей памятью Мееров И.Б. , Сысоев А.В., Сиднев А.А. Кафедра математического обеспечения ЭВМ
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9. Н.Новгород, 200 9 г. Инструменты параллельного программирования для систем с общей памятью. TBB . Краткое описание
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21. Н.Новгород, 2009 г. Инструменты параллельного программирования для систем с общей памятью. TBB . Краткое описание
  • 22.
  • 23.
  • 24. Пример. Матрично-векторное умножение Н.Новгород, 200 9 г. Инструменты параллельного программирования для систем с общей памятью. TBB . Краткое описание
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43. Функтор. Пример Н.Новгород, 200 9 г. Инструменты параллельного программирования для систем с общей памятью. TBB . Краткое описание class VectorsMultiplicator // Функтор { const double * matrix , * vector ; // Исходные данные для умножения double * const resultVector ; // Вектор результатов int const numOf Columns ; // Количество столбцов матрицы public: VectorsMultiplicator(double *tmatrix, double *tvector, double *tresultVector, int tnumOfColumns) : matrix(tmatrix), vector(tvector), resultVector(tresultVector), numOf Columns(t numOf Columns) {}   void operator()(const blocked_range<int>& r) const { int begin = r.begin(), end = r.end(); for (int i = begin; i != end; i++) resultVector[i] = VectorsMultiplication(&(matrix[i * numOfColumns]), vector , numOf Columns ); } };
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57. Н.Новгород, 2009 г. Инструменты параллельного программирования для систем с общей памятью. TBB . Краткое описание
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76. Пример использования функции tbb:: parallel_reduce . Реализация функтора… Н.Новгород, 200 9 г. Инструменты параллельного программирования для систем с общей памятью. TBB . Краткое описание class ScalarMultiplicator //Функтор { private: const double *a, *b; double c;   public: explicit ScalarMultiplicator(double *ta, double *tb): a(ta), b(tb), c(0) {}   ScalarMultiplicator(const ScalarMultiplicator& m, split): a(m.a), b(m.b), c(0) {} //…  };
  • 77. Пример использования функции tbb:: parallel_reduce . Реализация функтора Н.Новгород, 200 9 г. Инструменты параллельного программирования для систем с общей памятью. TBB . Краткое описание class ScalarMultiplicator //Функтор { //… public: void operator()(const blocked_range<int>& r) { int begin = r.begin(), end = r.end(); c += VectorsMultiplication(&(a[begin]), &(b[begin]), end - begin); }   void join(const ScalarMultiplicator& multiplicator) { c += multiplicator.c; }   double Result() { return c; } };
  • 78.
  • 79. Н.Новгород, 2009 г. Инструменты параллельного программирования для систем с общей памятью. TBB . Краткое описание
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89. Н.Новгород, 2009 г. Инструменты параллельного программирования для систем с общей памятью. TBB . Краткое описание
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.