2016-09-05 44 views
3

当我并行化的fibonacci实现(效率低下,只是为了比较库的性能)比正常的低效实现慢得多时,即使在使用我的i7-6700HQ处理器的所有8个逻辑内核之后。与非并行实施相比,处理器风扇开始处理时间非常缓慢。使用intel TBB的低效fibonacci系列比非线程实现慢得多

的例子是直接从TBB教程英特尔 - https://www.threadingbuildingblocks.org/tutorial-intel-tbb-task-based-programming

这里是我的代码

#include <tbb/task_group.h> 
#include <chrono> 
#include <iostream> 

#define FIB_NUM 40 

long fib1(int n) 
{ 
    if(n < 2) return n; 

    else 
    { 
     int x, y; 
     tbb::task_group g; 
     g.run([&]{x=fib1(n - 1);}); 
     g.run([&]{y=fib1(n - 2);}); 
     g.wait(); 
     return x + y; 
    } 
} 

long fib2(int n) 
{ 
    return n < 2? n : fib2(n - 1) + fib2(n - 2); 
} 

int main() 
{ 
    auto t1 = std::chrono::high_resolution_clock::now(); 
    std::cout << fib2(FIB_NUM) << std::endl; 
    auto t2 = std::chrono::high_resolution_clock::now(); 
    std::cout << (t2 - t1).count() << std::endl; 
    t1 = std::chrono::high_resolution_clock::now(); 
    std::cout << fib1(FIB_NUM) << std::endl; 
    t2 = std::chrono::high_resolution_clock::now(); 
    std::cout << (t2 - t1).count() << std::endl; 
} 

我不知道我做错了。如果有人能指出它会有所帮助。

谢谢

+1

从您的链接:“不是一个可扩展的解决方案”=>毫不奇怪,实现比平凡慢。你创建了很多线程,并对它们进行同步,只是做了一个补充......创建线程的开销比你意识到的更大。 – Garf365

+0

哦,我明白了!我其实想要将递归矩阵乘法并行化为一项任务。我想过用tbb来达到这个目的。如果是这种情况,TBB是否值得使用该应用程序?事实上,tbb适用于什么应用?想要一些资源来指导我。谢谢 –

+0

要求外部资源是SO的Off Topic。但是,也许,关于使用线程来提高计算速度的机会的一般问题可以被接受(不确定)。 ou可以在计算大量独立数据时使用线程(使用tbb或其他lib)(如对图像应用过滤器或计算平均值) – Garf365

回答

7

该示例的主要问题是小任务。叶子任务(n<2)只计算return n。毫无疑问,并行性是无效的。当子问题被认为对于并行化来说太小时,可以通过“截断”条件来改进该示例。让我们假设是没有意义的计算并行第12张斐波那契数,我们将使用串行执行,而不是:

long fib1(int n) 
{ 
    // Use a serial implementation for "small" numbers. 
    if(n < 12) return fib2(n); 
    else 
    { 
     int x, y; 
     tbb::task_group g; 
     g.run([&]{x=fib1(n - 1);}); 
     g.run([&]{y=fib1(n - 2);}); 
     g.wait(); 
     return x + y; 
    } 
} 

也许,你想阅读有关Divide and ConquerThe Task Scheduler文章。

P.S.英特尔TBB使用基于任务的方法进行并行处理。方法tbb::task_group::run创建一个任务(不是线程),当线程池中的一个线程可用时,该任务将被执行。因此,系统中有多少任务并不重要 - 线程的数量总是有限的。

+0

我不能在你的答案中打开链接,并得到'403 Forbidden'。顺便说一句,我似乎无法打开[https://software.intel.com](https://software.intel.com)上的任何页面),并且总是得到'403 Forbidden'我曾经在TBB上谷歌的东西,第一个答案总是来自这个网站,我无法打开它...你有什么想法吗? –

+0

开源网站上的相同链接 https://www.threadingbuildingblocks.org/docs/help/index.htm#tbb_userguide/Design_Patterns/Divide_and_Conquer.html和https://www.threadingbuildingblocks.org/docs/help/hh_goto的.htm?指数。htm#tbb_userguide/The_Task_Scheduler.html –

+0

我们的TBB支持团队要求发布此响应:您是否可以尝试使用不同的浏览器访问software.intel.com? 如果它没有帮助,我建议安装一个HTTP分析器http://www.ieinspector.com/httpanalyzer/index.html来检查浏览器发送的真实HTTP请求是什么以及服务器的答案是什么。安装在Web浏览器中的一些插件可能会影响HTTP请求的生成。 –