This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
HPCE / dt10 / 2013 / 8.1
cilk void MyTask(int start, int end)
{
if(cond())
return 0;
spawn MyTask(start,(start+end)/2);
spawn MyTask((start+end)/2,end);
DoSomethingFirst();
sync;
DoSomethingElse();
return 0;
}
class MyTask
: public tbb::task
{
int start, end;
Task(int _start, int _end)
{ start=_start; end=_end; }
tbb::task * execute()
{
if(cond())
return 0;
set_ref_count(3);
MyTask &t1=*new(allocate_child())
MyTask(start,(start+end)/2));
spawn(t1);
MyTask &t2=*new(allocate_child())
MyTask((start+end)/2), end);
spawn(t2);
DoSomethingFirst();
wait_for_all();
DoSomethingElse();
return 0;
}
};
HPCE / dt10 / 2013 / 8.2
cilk void MyTask(int start, int end)
{
if(cond())
return 0;
spawn MyTask(start,(start+end)/2);
spawn MyTask((start+end)/2,end);
DoSomethingFirst();
sync;
DoSomethingElse();
return 0;
}
class MyTask
: public tbb::task
{
int start, end;
Task(int _start, int _end)
{ start=_start; end=_end; }
tbb::task * execute()
{
if(cond())
return 0;
set_ref_count(3);
MyTask &t1=*new(allocate_child())
MyTask(start,(start+end)/2));
spawn(t1);
MyTask &t2=*new(allocate_child())
MyTask((start+end)/2), end);
spawn(t2);
DoSomethingFirst();
wait_for_all();
DoSomethingElse();
return 0;
}
};
HPCE / dt10 / 2013 / 8.3
cilk void MyTask(int start, int end)
{
if(cond())
return 0;
spawn MyTask(start,(start+end)/2);
spawn MyTask((start+end)/2,end);
DoSomethingFirst();
sync;
DoSomethingElse();
return 0;
}
class MyTask
: public tbb::task
{
int start, end;
Task(int _start, int _end)
{ start=_start; end=_end; }
tbb::task * execute()
{
if(cond())
return 0;
set_ref_count(3);
MyTask &t1=*new(allocate_child())
MyTask(start,(start+end)/2));
spawn(t1);
MyTask &t2=*new(allocate_child())
MyTask((start+end)/2), end);
spawn(t2);
DoSomethingFirst();
wait_for_all();
DoSomethingElse();
return 0;
}
};
HPCE / dt10 / 2013 / 8.4
cilk void MyTask(int start, int end)
{
if(cond())
return 0;
spawn MyTask(start,(start+end)/2);
spawn MyTask((start+end)/2,end);
DoSomethingFirst();
sync;
DoSomethingElse();
return 0;
}
class MyTask
: public tbb::task
{
int start, end;
Task(int _start, int _end)
{ start=_start; end=_end; }
tbb::task * execute()
{
if(cond())
return 0;
set_ref_count(3);
MyTask &t1=*new(allocate_child())
MyTask(start,(start+end)/2));
spawn(t1);
MyTask &t2=*new(allocate_child())
MyTask((start+end)/2), end);
spawn(t2);
DoSomethingFirst();
wait_for_all();
DoSomethingElse();
return 0;
}
};
HPCE / dt10 / 2013 / 8.5
cilk void MyTask(int start, int end)
{
if(cond())
return 0;
spawn MyTask(start,(start+end)/2);
spawn MyTask((start+end)/2,end);
DoSomethingFirst();
sync;
DoSomethingElse();
return 0;
}
class MyTask
: public tbb::task
{
int start, end;
Task(int _start, int _end)
{ start=_start; end=_end; }
tbb::task * execute()
{
if(cond())
return 0;
set_ref_count(3);
MyTask &t1=*new(allocate_child())
MyTask(start,(start+end)/2));
spawn(t1);
MyTask &t2=*new(allocate_child())
MyTask((start+end)/2), end);
spawn(t2);
DoSomethingFirst();
wait_for_all();
DoSomethingElse();
return 0;
}
};
HPCE / dt10 / 2013 / 8.6
cilk void MyTask(int start, int end)
{
if(cond())
return 0;
spawn MyTask(start,(start+end)/2);
spawn MyTask((start+end)/2,end);
DoSomethingFirst();
sync;
DoSomethingElse();
return 0;
}
class MyTask
: public tbb::task
{
int start, end;
Task(int _start, int _end)
{ start=_start; end=_end; }
tbb::task * execute()
{
if(cond())
return 0;
set_ref_count(3);
MyTask &t1=*new(allocate_child())
MyTask(start,(start+end)/2));
spawn(t1);
MyTask &t2=*new(allocate_child())
MyTask((start+end)/2), end);
spawn(t2);
DoSomethingFirst();
wait_for_all();
DoSomethingElse();
return 0;
}
};
HPCE / dt10 / 2013 / 8.7
cilk void MyTask(int start, int end)
{
if(cond())
return 0;
spawn MyTask(start,(start+end)/2);
spawn MyTask((start+end)/2,end);
DoSomethingFirst();
sync;
DoSomethingElse();
return 0;
}
class MyTask
: public tbb::task
{
int start, end;
Task(int _start, int _end)
{ start=_start; end=_end; }
tbb::task * execute()
{
if(cond())
return 0;
set_ref_count(3);
MyTask &t1=*new(allocate_child())
MyTask(start,(start+end)/2));
spawn(t1);
MyTask &t2=*new(allocate_child())
MyTask((start+end)/2), end);
spawn(t2);
DoSomethingFirst();
wait_for_all();
DoSomethingElse();
return 0;
}
};
HPCE / dt10 / 2013 / 8.8
cilk void CreateTasks(int start, int end)
{
spawn MyTask(start, end);
sync;
}
class MyTask
: public tbb::task
{
...
Task(int _start, int _end);
tbb::task * execute();
};
void CreateTasks(int start, int end)
{
Task &root=*new(allocate_root())
MyTask(start,end);
tbb::task::spawn_root_and_wait();
}
See section Tasks section of the TBB tutorial http://software.intel.com/sites/products/documentation/doclib/tbb_sa/help/tbb_userguide/The_Task_Scheduler.htm