gpt4 book ai didi

c++ - 在 tbb 中回收 parent 作为 child

转载 作者:行者123 更新时间:2023-11-30 04:19:54 24 4
gpt4 key购买 nike

我想使用 tbb::task 并行化一个看似简单的问题。我的任务可以拆分成子任务,子任务的数量无法选择,而是由任务的状态决定(事先不知道)。由于父任务不需要其子任务的结果,因此我想将父任务作为子任务进行回收。我在在线文档或示例中找不到一个很好的工作示例,因此我的问题在这里。我目前的想法是按照这些行进行编码:

struct my_task : tbb::task {
typedef implementation_defined task_data;
task_data DATA;
my_task(task_data const&data) : DATA(data) {}
void reset_state(task_data const&data) { DATA=data; }
bool is_small() const;
void serial_execution();
bool has_more_sub_tasks() const;
task_data parameters_for_next_sub_task();
tbb::task*execute()
{
if(is_small()) {
serial_execution();
return nullptr;
}
tbb::empty_task&Continuation = allocate_continuation(); // <-- correct?
task_data first_sub_task = parameters_for_next_sub_task();
int sub_task_counter = 1;
tbb::task_list further_sub_tasks;
for(; has_more_sub_tasks(); ++sub_task_counter)
further_sub_tasks.push_back(*new(Continuation.allocate_child())
my_task(parameters_for_next_sub_task());
Continuation.set_ref_count(sub_task_counter); // <-- correct?
spawn(further_sub_tasks);
recycle_as_child_of(Continuation); // <-- correct?
reset_state(first_sub_task); // change state
return this; // <-- correct?
}
};

my_task*root_task = new(tbb::task::allocate_root())
my_task(parameters_for_root_task());
tbb::task::spawn_root_and_wait(*root_task);

这是执行此操作的正确和/或最佳方法吗? (请注意,在我上面的代码中,空的延续任务既不会产生也不会返回)

最佳答案

创建延续的行应该是:

tbb::empty_task&Continuation = *new( allocate_continuation() ) tbb::empty_task;

set_ref_count 和 reset_state 之间的逻辑看起来是正确的。

关于c++ - 在 tbb 中回收 parent 作为 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15508272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com