1

私と s を使用して、一見単純な問題を並列化したいと考えてい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);

これはこれを行うための正しい方法および/または最良の方法ですか? (上記のコードでは、空の継続タスクは生成も返されないことに注意してください)

4

1 に答える 1

2

継続を作成する行は次のようになります。

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

set_ref_count と reset_state の間のロジックは正しいようです。

于 2013-03-22T15:45:36.713 に答える