Задачи на нитях строительных блоков - PullRequest
2 голосов
/ 03 августа 2010

Вот пример кода:

#include <iostream>
#include <list>
#include <tbb/task.h>
#include <tbb/task_group.h>
#include <stdlib.h>
#include <boost/thread.hpp>

using namespace tbb;

 long fib(long a)
{
  if (a < 2) return 1;

  return fib(a - 1) + fib(a - 2);
}

class PrintTask 
{
public:
    void operator()()
    {
        std::cout << "hi world!: " <<  boost::this_thread::get_id() << std::endl;

        fib(50);
    }
};

int main(int argc, char** argv)
{     
    task_group group;

    for (int i = 0; i < 100; ++i)
    {
      group.run(PrintTask());
    }      

    group.wait();

    return(0);
}

Здесь я вычисляю большую последовательность Фибоначчи только для того, чтобы симулировать неблокирующие вычисления.Я наблюдал, что этот код будет генерировать более двух потоков (мой компьютер - Core2Duo), но вызываются только первая и вторая задачи.Это спец?

Ответы [ 2 ]

3 голосов
/ 22 ноября 2010

Да, это ожидаемое поведение.

TBB - это библиотека, разработанная для распараллеливания кода для выполнения. Он не предназначен для асинхронных задач - официальная документация гласит, что для таких задач вам следует использовать другую библиотеку, например, pthreads (или, в вашем случае, boost :: thread).

Для максимальной производительности не имеет смысла иметь больше потоков, чем у вас ядер, так как в этом есть некоторые существенные накладные расходы (не только переключение контекста, но и такие вещи, как очистка кэша).

EDIT: Вы можете прочитать об этом в Tutorial . В частности, в разделе 1.2 «Преимущества» говорится

Intel® Threading Building Blocks нацеливает многопоточность на производительность. Большинство потоковых пакетов общего назначения поддерживают множество различных типов потоков, таких как потоки для асинхронных событий в графическом пользовательском интерфейсы. В результате пакеты общего назначения, как правило, инструменты низкого уровня, которые обеспечивают основу, а не решение. Вместо, Intel® Threading Building Blocks фокусируется на конкретной цели распараллеливание вычислительно интенсивной работы, поставка простые решения более высокого уровня.

и

Intel® Threading Building Blocks совместим с другими потоками пакеты. Поскольку библиотека не предназначена для решения всех проблем с потоками, он может легко сосуществовать с другими пакетами потоков.

1 голос
/ 03 августа 2010

Массовое блокирование многопоточности (использование std :: cout) является анти-паттерном в многопоточности и может привести к плохому поведению, потому что это неправильно.Кроме того, TBB оставляет за собой право реализовывать group.run (), черт возьми, ему нравится и порождает любые потоки, которые ему нравятся.Если у вас только двухъядерное ядро, и вы коллируете с тяжелой работой, почему он должен порождать более двух потоков?ОС и другие приложения будут с удовольствием съедать оставшееся фоновое время.

...