У меня есть критически важная для производительности лямбда-функция p, которая что-то вычисляет и записывает результат во внешнюю структуру данных:
class Foo {
...
std::vector v;
auto p = [&]() {
int res;
// Calculate and assign to res
static std::mutex mutex;
{
std::lock_guard lock(mutex);
v.emplace_back(res);
}
}
...
}
Теперь я хочу вызвать p() параллельно несколько раз (скажем, 12 раз) в моих 48 потоках. Вызовы p() потокобезопасны, но очень дороги. Чтобы минимизировать накладные расходы на переключение контекста (я не уверен, что это вообще играет такую большую роль), вместо того, чтобы одновременно выполнять 12 вызовов p() во всех 48 потоках, как в следующее:
tbb::parallel_for(0, 12, [](i) {
p();
});
,
Я хочу вызвать p() одновременно 12 раз, но вместо этого каждый вызов выполняется только в 4 потоках. Есть ли способ добиться этого с помощью tbb::task_arena? Я также буду открыт для альтернативных решений.
Я попробовал следующий код, но не уверен, что он делает то, что я пытаюсь сделать.
Я' Я просмотрел документацию tbb::task_arena, но мне все еще непонятно.
std::vector arenas(12)
for(int i = 0; i < 12; i++) {
arenas.initialize(4);
}
tbb::parallel_for(0, 12, [&](int i) {
arenas.execute([&] {
p();
std::cout
Подробнее здесь: https://stackoverflow.com/questions/784 ... n-parallel
C++ TBB: как запустить несколько tbb::task_arena параллельно? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему вызов неоднозначен между Task.Run
(Func ) и Task.Run(Func ) при передаче имени метода
Anonymous » » в форуме C# - 0 Ответы
- 92 Просмотры
-
Последнее сообщение Anonymous
-