计算斐波那契数的一般tbb问题 我在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; } 类任务:公共任务 { 公众: 康斯特朗n; 长*常数和; fibstask(long n_u,long*sum_u):n(n_u),sum(sum_u){ 任务*执行() { //重写虚拟函数任务::执行 if(n平行fib(3); std::cout

计算斐波那契数的一般tbb问题 我在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; } 类任务:公共任务 { 公众: 康斯特朗n; 长*常数和; fibstask(long n_u,long*sum_u):n(n_u),sum(sum_u){ 任务*执行() { //重写虚拟函数任务::执行 if(n平行fib(3); std::cout,c++,multithreading,parallel-processing,tbb,C++,Multithreading,Parallel Processing,Tbb,此处显示了截止值。它必须至少为2。例如: if( n<2 ) { *sum = n; return NULL; } if(它与未初始化的x和y有关?long main是非标准的。@Cheers,是的,execute()返回值与那些0和NULL都有问题,但我认为这与此无关)我已经尝试过了。它没有帮助。我已经复制和粘贴代码,但当我调用它时它不起作用。@ USER 3017335可能是因为不同的编译器在默认情况下将代码“> > X ”和“代码> Y < /C> >为某个值。但是

此处显示了截止值。它必须至少为2。例如:

if( n<2 ) {
    *sum = n;
    return NULL;
}

if(它与未初始化的
x
y
有关?
long main
是非标准的。@Cheers,是的,
execute()
返回值与那些
0
NULL
都有问题,但我认为这与此无关)我已经尝试过了。它没有帮助。我已经复制和粘贴代码,但当我调用它时它不起作用。@ USER 3017335可能是因为不同的编译器在默认情况下将代码“> > X ”和“代码> Y < /C> >为某个值。但是这是非标准的。如果我记得正确,在C++中只有类成员和全局变量被保证。默认情况下是初始化的。好的,但我不太明白。长SerialFib和长ParallelFib应该在类FibTask的范围内定义吗??“警告:请注意,此示例仅用于演示此特定的低级TBB API以及此特定的使用方法。除非您确实确定为什么要这样做,否则它不用于重用。"那么我应该修改这个代码来运行它吗?这不起作用。你应该返回
*任务
而不是
。这根本不能回答这个问题。@luk32,谢谢。我的意思是直接“返回”总和,而不是递归。我会修正的。是的,现在它可以工作了,你也可以写
长x=0,y=1;
,这样就可以了因此,请生成正确的序列,偏移1。但这将是更丑陋的解决方案。您在没有上下文的情况下发布了太少的代码,并且提到了实际上并不需要的
SerialFib
。现在,如果您使用
if
,它会更清晰、更有效。我发现整个示例非常丑陋。GJ关于如何使其工作=)
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;
    }
}