TBB: Как получить текущую арену задач? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть небольшой класс наблюдателя планировщика

namespace
{
    class TestObserver : public tbb::task_scheduler_observer
    {
    public:
        TestObserver(tbb::task_arena& a) : tbb::task_scheduler_observer(a)
        {
            observe(true); // activate the observer
        }

        /*override*/ void on_scheduler_entry(bool worker)
        {
            // Do something here
            std::cout << "on_scheduler_entry: " << tbb::task_arena::current_thread_index() << std::endl;
        }

        /*override*/ void on_scheduler_exit(bool worker) 
        { 
            std::cout << "on_scheduler_exit: " << tbb::task_arena::current_thread_index() << std::endl;
        }
    };
}

И я хотел бы инициализировать его с текущей областью задач. В моем основном коде я инициализирую TBB таким образом:

unsigned int numThreads = num_threads;
if (numThreads < 1) numThreads = tbb::task_scheduler_init::automatic;

tbb::task_scheduler_init init(numThreads);

TestObserver obs(...); // <-- fail!

Я хотел бы инициализировать наблюдателя с текущей областью задач. Хотя я не инициализирую однозначно, TBB должен делать все автоматически, верно?

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Не использовать tbb::task_scheduler_init класс; он уже устарел и в конечном итоге будет удален. Если вам нужно ограничить количество потоков в глобальном масштабе, используйте вместо этого tbb::global_control; если вы хотите ограничить параллелизм для данной работы, используйте tbb::task_arena. В последнем случае у вас также не возникнет проблем с присоединением к нему наблюдателя.

Чтобы создать наблюдателя для арены текущей задачи, используйте tbb::task_scheduler_observer(true). Логический аргумент используется, чтобы отличать guish такого «локального» наблюдателя от «глобального», то есть не привязанного ни к какой конкретной c арене («глобальная» семантика была исходной для наблюдателей TBB, и он принял конструктор по умолчанию).

Вы также можете создать объект task_arena, прикрепленный к текущей арене, и использовать его для инициализации наблюдателя, а также для отправки задания. Для этого постройте или инициализируйте арену с помощью специального аргумента: tbb::task_arena(tbb::task_arena::attach()).

0 голосов
/ 19 марта 2020

Если вы не создали явное tbb::task_arena, я не знаю о каком-либо механизме извлечения ссылки на него, и конструктор по умолчанию tbb::task_scheduler_observer будет внутренне сопоставлен с ареной, созданной неявно. Конструктор, который ссылается на tbb::task_arena, предназначен для использования с пользовательскими аренами.

...