我遇到了下面的tbb模板,作为基于任务的编程的一个例子,用于计算c ++中斐波纳契数的总和。但是当我运行它时,我得到的值为1717986912,但情况并非如此。输出应该是3.我做错了什么?
class FibTask: public task
{
public:
const long n;
long * const sum;
FibTask( long n_, long* sum_ ) : n(n_), sum(sum_) {}
task* execute( )
{
// Overrides virtual function task::execute
if( n < 0)
{
return 0;
}
else
{
long x, y;
FibTask& a = *new( allocate_child( ) ) FibTask(n-1,&x);
FibTask& b = *new( allocate_child( ) ) FibTask(n-2,&y);
// Set ref_count to "two children plus one for the wait".
set_ref_count(3);
// Start b running.
spawn( b );
// Start a running and wait for all children (a and b).
spawn_and_wait_for_all( a );
// Do the sum
*sum = x+y;
}
return NULL;
}
long ParallelFib( long n )
{
long sum;
FibTask& a = *new(task::allocate_root( )) FibTask(n,&sum);
task::spawn_root_and_wait(a);
return sum;
}
};
long main(int argc, char** argv)
{
FibTask * obj = new FibTask(3,0);
long b = obj->ParallelFib(3);
std::cout << b;
return 0;
}
答案 0 :(得分:1)
截止点在这里搞砸了。它至少必须是2。 E.g:
if( n<2 ) {
*sum = n;
return NULL;
}
原始示例还使用了此处显示的http://www.threadingbuildingblocks.org/docs/help/tbb_userguide/Simple_Example_Fibonacci_Numbers.htm
中的SerialFib使用低效阻塞样式技术计算斐波纳契数的低效方法在不调用SerialFib()的情况下效率更低。
警告:请注意,此示例仅用于演示此特定的低级TBB API以及此特定的使用方式。除非您确实知道为什么要这样做,否则它不适合重复使用。
现代高级API(但仍然是低效的Fibonacci算法)看起来像这样:
int Fib(int n) {
if( n<CUTOFF ) { // 2 is minimum
return fibSerial(n);
} else {
int x, y;
tbb::parallel_invoke([&]{x=Fib(n-1);}, [&]{y=Fib(n-2);});
return x+y;
}
}