`
pleasetojava
  • 浏览: 729419 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

intel线程库tbb的使用

阅读更多

首先下载:

http://www.threadingbuildingblocks.org/uploads/77/111/2.1/tbb21_20080605oss_win.zip

当前是2.1版本

解压到c盘,打开vs2005,设置vc++的项目目录

include:

C:\tbb21oss_win\include

执行文件:

C:\tbb21oss_win\ia32\vc8\bin

库文件:

C:\tbb21oss_win\ia32\vc8\lib

最后设置 我的电脑--环境变量设置

添加下面到path部分的最前面,记得加上一个“;”:C:\tbb21oss_win\ia32\vc8\bin

然后添加一个变量:

TBB21_INSTALL_DIR 为C:\tbb21oss_win

开启vs2005的命令行工具,进入到C:\tbb21oss_win\ia32\vc8\bin路径,执行tbbvars.bat文件

可以开始第一个程序了,记得带上tbb.lib对应的是release编译模式

  1. /*
  2. Copyright2005-2008IntelCorporation.AllRightsReserved.
  3. ThisfileispartofThreadingBuildingBlocks.
  4. ThreadingBuildingBlocksisfreesoftware;youcanredistributeit
  5. and/ormodifyitunderthetermsoftheGNUGeneralPublicLicense
  6. version2aspublishedbytheFreeSoftwareFoundation.
  7. ThreadingBuildingBlocksisdistributedinthehopethatitwillbe
  8. useful,butWITHOUTANYWARRANTY;withouteventheimpliedwarranty
  9. ofMERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.Seethe
  10. GNUGeneralPublicLicenseformoredetails.
  11. YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense
  12. alongwithThreadingBuildingBlocks;ifnot,writetotheFreeSoftware
  13. Foundation,Inc.,51FranklinSt,FifthFloor,Boston,MA02110-1301USA
  14. Asaspecialexception,youmayusethisfileaspartofafreesoftware
  15. librarywithoutrestriction.Specifically,ifotherfilesinstantiate
  16. templatesorusemacrosorinlinefunctionsfromthisfile,oryoucompile
  17. thisfileandlinkitwithotherfilestoproduceanexecutable,this
  18. filedoesnotbyitselfcausetheresultingexecutabletobecoveredby
  19. theGNUGeneralPublicLicense.Thisexceptiondoesnothowever
  20. invalidateanyotherreasonswhytheexecutablefilemightbecoveredby
  21. theGNUGeneralPublicLicense.
  22. */
  23. //
  24. //Exampleprogramthatreadsafileoftextandchangesthefirstletter
  25. //ofeachwordtouppercase.
  26. //
  27. #include"tbb/pipeline.h"
  28. #include"tbb/tick_count.h"
  29. #include"tbb/task_scheduler_init.h"
  30. #include<cstring>
  31. #include<cstdlib>
  32. #include<cstdio>
  33. #include<cctype>
  34. usingnamespacestd;
  35. //!Bufferthatholdsblockofcharactersandlastcharacterofpreviousbuffer.
  36. classMyBuffer{
  37. staticconstsize_tbuffer_size=10000;
  38. char*my_end;
  39. //!storage[0]holdsthelastcharacterofthepreviousbuffer.
  40. charstorage[1+buffer_size];
  41. public:
  42. //!Pointertofirstcharacterinthebuffer
  43. char*begin(){returnstorage+1;}
  44. constchar*begin()const{returnstorage+1;}
  45. //!Pointertoonepastlastcharacterinthebuffer
  46. char*end()const{returnmy_end;}
  47. //!Setendofbuffer.
  48. voidset_end(char*new_ptr){my_end=new_ptr;}
  49. //!Numberofbytesabuffercanhold
  50. size_tmax_size()const{returnbuffer_size;}
  51. //!Numberofbytesappendedtobuffer.
  52. size_tsize()const{returnmy_end-begin();}
  53. };
  54. classMyInputFilter:publictbb::filter{
  55. public:
  56. staticconstsize_tn_buffer=8;
  57. MyInputFilter(FILE*input_file_);
  58. private:
  59. FILE*input_file;
  60. size_tnext_buffer;
  61. charlast_char_of_previous_buffer;
  62. MyBufferbuffer[n_buffer];
  63. /*override*/void*operator()(void*);
  64. };
  65. MyInputFilter::MyInputFilter(FILE*input_file_):
  66. filter(/*is_serial=*/true),
  67. next_buffer(0),
  68. input_file(input_file_),
  69. last_char_of_previous_buffer('')
  70. {
  71. }
  72. void*MyInputFilter::operator()(void*){
  73. MyBuffer&b=buffer[next_buffer];
  74. next_buffer=(next_buffer+1)%n_buffer;
  75. size_tn=fread(b.begin(),1,b.max_size(),input_file);
  76. if(!n){
  77. //endoffile
  78. returnNULL;
  79. }else{
  80. b.begin()[-1]=last_char_of_previous_buffer;
  81. last_char_of_previous_buffer=b.begin()[n-1];
  82. b.set_end(b.begin()+n);
  83. return&b;
  84. }
  85. }
  86. //!Filterthatchangesthefirstletterofeachwordfromlowercasetouppercase.
  87. classMyTransformFilter:publictbb::filter{
  88. public:
  89. MyTransformFilter();
  90. /*override*/void*operator()(void*item);
  91. };
  92. MyTransformFilter::MyTransformFilter():
  93. tbb::filter(/*ordered=*/false)
  94. {}
  95. /*override*/void*MyTransformFilter::operator()(void*item){
  96. MyBuffer&b=*static_cast<MyBuffer*>(item);
  97. intprev_char_is_space=b.begin()[-1]=='';
  98. for(char*s=b.begin();s!=b.end();++s){
  99. if(prev_char_is_space&&islower((unsignedchar)*s))
  100. *s=toupper(*s);
  101. prev_char_is_space=isspace((unsignedchar)*s);
  102. }
  103. return&b;
  104. }
  105. //!Filterthatwriteseachbuffertoafile.
  106. classMyOutputFilter:publictbb::filter{
  107. FILE*my_output_file;
  108. public:
  109. MyOutputFilter(FILE*output_file);
  110. /*override*/void*operator()(void*item);
  111. };
  112. MyOutputFilter::MyOutputFilter(FILE*output_file):
  113. tbb::filter(/*is_serial=*/true),
  114. my_output_file(output_file)
  115. {
  116. }
  117. void*MyOutputFilter::operator()(void*item){
  118. MyBuffer&b=*static_cast<MyBuffer*>(item);
  119. fwrite(b.begin(),1,b.size(),my_output_file);
  120. returnNULL;
  121. }
  122. staticintNThread=tbb::task_scheduler_init::automatic;
  123. staticconstchar*InputFileName="input.txt";
  124. staticconstchar*OutputFileName="output.txt";
  125. staticboolis_number_of_threads_set=false;
  126. voidUsage()
  127. {
  128. fprintf(stderr,"Usage:\ttext_filter[input-file[output-file[nthread]]]\n");
  129. }
  130. intParseCommandLine(intargc,char*argv[]){
  131. //Parsecommandline
  132. if(argc>4){
  133. Usage();
  134. return0;
  135. }
  136. if(argc>=2)InputFileName=argv[1];
  137. if(argc>=3)OutputFileName=argv[2];
  138. if(argc>=4){
  139. NThread=strtol(argv[3],0,0);
  140. if(NThread<1){
  141. fprintf(stderr,"nthreadsetto%d,butmustbeatleast1\n",NThread);
  142. return0;
  143. }
  144. is_number_of_threads_set=true;//Numberofthreadsissetexplicitly
  145. }
  146. return1;
  147. }
  148. intrun_pipeline(intnthreads)
  149. {
  150. FILE*input_file=fopen(InputFileName,"r");
  151. if(!input_file){
  152. perror(InputFileName);
  153. Usage();
  154. return0;
  155. }
  156. FILE*output_file=fopen(OutputFileName,"w");
  157. if(!output_file){
  158. perror(OutputFileName);
  159. return0;
  160. }
  161. //Createthepipeline
  162. tbb::pipelinepipeline;
  163. //Createfile-readingwritingstageandaddittothepipeline
  164. MyInputFilterinput_filter(input_file);
  165. pipeline.add_filter(input_filter);
  166. //Createcapitalizationstageandaddittothepipeline
  167. MyTransformFiltertransform_filter;
  168. pipeline.add_filter(transform_filter);
  169. //Createfile-writingstageandaddittothepipeline
  170. MyOutputFilteroutput_filter(output_file);
  171. pipeline.add_filter(output_filter);
  172. //Runthepipeline
  173. tbb::tick_countt0=tbb::tick_count::now();
  174. pipeline.run(MyInputFilter::n_buffer);
  175. tbb::tick_countt1=tbb::tick_count::now();
  176. //Removefiltersfrompipelinebeforetheyareimplicitlydestroyed.
  177. pipeline.clear();
  178. fclose(output_file);
  179. fclose(input_file);
  180. if(is_number_of_threads_set){
  181. printf("threads=%dtime=%g\n",nthreads,(t1-t0).seconds());
  182. }else{
  183. if(nthreads==1){
  184. printf("serialruntime=%g\n",(t1-t0).seconds());
  185. }else{
  186. printf("parallelruntime=%g\n",(t1-t0).seconds());
  187. }
  188. }
  189. return1;
  190. }
  191. intmain(intargc,char*argv[]){
  192. if(!ParseCommandLine(argc,argv))
  193. return1;
  194. if(is_number_of_threads_set){
  195. //Starttaskscheduler
  196. tbb::task_scheduler_initinit(NThread);
  197. if(!run_pipeline(NThread))
  198. return1;
  199. }else{//Numberofthreadswasn'tsetexplicitly.Runserialandparallelversion
  200. {//serialrun
  201. tbb::task_scheduler_initinit_serial(1);
  202. if(!run_pipeline(1))
  203. return1;
  204. }
  205. {//parallelrun(numberofthreadsisselectedautomatically)
  206. tbb::task_scheduler_initinit_parallel;
  207. if(!run_pipeline(0))
  208. return1;
  209. }
  210. }
  211. return0;
  212. }

第二个程序,对应debug模式,带上tbb_debug.lib:

  1. #include"tbb/task_scheduler_init.h"
  2. #include"tbb/blocked_range.h"
  3. #include"tbb/parallel_for.h"
  4. //链接tbb_debug.lib
  5. //#pragmacomment(lib,"tbb_debug.lib")
  6. usingnamespacetbb;
  7. //对每个Item执行该操作
  8. voidFoo(floatvalue)
  9. {
  10. printf("%.2f\n",value);
  11. }
  12. classApplyFoo
  13. {
  14. float*constmy_a;
  15. public:
  16. voidoperator()(constblocked_range<size_t>&r)const
  17. {
  18. float*a=my_a;
  19. for(size_ti=r.begin();i!=r.end();++i)
  20. Foo(a[i]);
  21. }
  22. ApplyFoo(floata[]):my_a(a){}
  23. };
  24. int_tmain(intargc,_TCHAR*argv[])
  25. {
  26. //创建taskscheduler
  27. //task_scheduler_init支持一个参数,以指定使用的线程数
  28. task_scheduler_initinit;
  29. floata[100];
  30. for(inti=0;i<100;i++)
  31. a[i]=(float)i;
  32. //TBB会把数组分成若干的block
  33. //对block调用ApplyFoo这个functor
  34. parallel_for(blocked_range<size_t>(0,100),ApplyFoo(a));
  35. return0;
  36. }
分享到:
评论

相关推荐

    TBB多线程库

    **TBB多线程库详解** Intel的Threading Building Blocks(TBB)是一个高效、灵活的C++库,专门设计用于解决多核处理器环境下的并行编程问题。TBB库提供了一组高级接口,帮助开发者编写出可扩展、高性能的多线程应用...

    inteltbb.rar

    在给定的“inteltbb.rar”压缩包中,包含了一系列资源,用于在Windows 7环境下,使用Visual Studio 2013编译和配置TBB库,以便与OpenCV等其他库共用。 **并行计算** 是现代计算机科学中的关键概念,特别是在多核...

    tbb库Thread Building Blocks

    TBB(Thread Building Blocks)是由Intel开发的一个开源库,全称为“线程构建模块”。它旨在提供一种高效、灵活的方式来管理和利用多核处理器的并行计算能力,使开发者能够更容易地编写出高性能、可扩展的多线程应用...

    tbb-Intel Threading Building Blocks 线程构建模块

    **Intel Threading Building Blocks (TBB) 线程构建模块** Intel Threading Building Blocks (TBB) 是Intel公司推出的一款强大的开源库,专门用于帮助C++开发者进行高效的并行编程。TBB的设计目标是简化多核处理器...

    tbb库 源代码 20150424

    TBB库,全称为Threading Building Blocks,是由Intel公司开发的一款高效、易用的多线程编程库。它为C++程序员提供了一组丰富的模板类和函数,使得在多核处理器上实现并行计算变得简单而高效。20150424版本的TBB库是...

    intel-tbb-20190525 经典并行库最新源代码

    **Intel TBB(Threading Building Blocks)** 是一个强大的并行编程库,由Intel公司开发,采用标准C++编写,旨在提升多核处理器上的数据并行计算能力。TBB库的核心理念是提供一种抽象的方式,使得程序员可以更容易地...

    tbb CPU 并行计算库,aarch64 6.5.0交叉编译移植

    TBB,全称为Threading Building Blocks,是由Intel开发的一个开源库,旨在简化多核处理器和多线程编程。它提供了一套C++模板类,用于高效地管理和执行并行任务,帮助开发者在CPU的多个核心上实现数据并行和任务并行...

    Intel TBB Library

    TBB,Thread Building Blocks,线程构建模块,是Intel公司开发的并行编程开发的工具。 OSCON 上,Intel 宣布,Threading Building Blocks,Intel 众多软件开发工具中的一个,open source了。协议是 GPLv2。 TBB 获得过...

    并行计算 TBB库 多线程

    英特尔的Threading Building Blocks(TBB)库是实现并行计算的一种高效工具,尤其在多线程编程方面表现出色。TBB库提供了高级别的抽象,使得开发者能够更方便地利用多核处理器的性能,而无需深入理解底层的线程管理...

    intel的tbb库,版本是2018 update5

    TBB,Thread Building Blocks,线程构建模块,是Intel公司开发的并行编程开发的工具。 OSCON 上,Intel 宣布,Threading Building Blocks,Intel 众多软件开发工具中的一个,open source了。协议是 GPLv2。 TBB 获得过...

    TBB并发容器 学习笔记

    TBB(Thread Building Blocks)是Intel开发的一个开源C++模板库,专为并行编程设计,旨在帮助开发者充分利用多核处理器的性能。TBB的主要目标是简化并行编程,提供高效、灵活的工具,使程序员可以更容易地创建可扩展...

    TBB30_intel64+ia32_sdk.7z

    Threading Building Blocks是由Intel开发的一个并行编程库,它提供了一种C++模板库,用于帮助开发者编写多线程应用程序。TBB的主要目标是简化并行编程,让开发者能够利用多核处理器的计算能力,提高程序性能,而无需...

    tbb-2020.1-win.zip

    Threading Building Blocks(TBB)是Intel开发的一个C++库,它提供了一组模板类和函数,帮助开发者轻松地编写高性能的并行代码,无需深入理解底层的线程管理细节。TBB的核心概念包括任务调度器、并行算法和数据并行...

    tbb-tbb_2020.zip

    标题 "tbb-tbb_2020.zip" 指示的是 Intel 的 Threading Building Blocks (TBB) 库的一个版本,这是针对 C++ 开发的并行编程框架,特别适用于优化多线程应用程序。在 OpenCV 中,TBB 被广泛使用来提升图像处理和...

    tbb40_20120408oss_win

    TBB是一个C++库,它提供了并行算法、数据结构和线程管理工具,旨在帮助开发者充分利用多核处理器的性能。 描述中提到的“tbb_debug.dll”是TBB库的一个调试版本动态链接库。在开发过程中,调试版本的库通常包含额外...

    intel tbb src

    **Intel TBB (Threading Building Blocks)** 是一个开源的并行编程库,由Intel公司开发,主要用于提升多核处理器上应用程序的性能。TBB的主要目标是简化并行编程,让开发者能够更容易地利用多核处理器的计算能力。在...

    tbb2018年最新版64bit

    **正文** Intel TBB(Thread Building Blocks)是Intel公司推出的一款高效的并行编程库,专为多核处理器设计,旨在简化并行编程的...使用TBB,开发者可以更专注于解决业务问题,而不是关注底层的线程管理和同步细节。

    TBB tutorial.pdf

    《Intel Threading Building Blocks Tutorial》是一份详细的指南,旨在教授如何使用Intel的Threading Building Blocks (TBB)库来开发高效、多线程的应用程序。TBB是一个开源库,它为C++程序员提供了高级别的并行编程...

    tbb并行编程文件

    标题中的“tbb并行编程文件”指的是这个压缩包包含的资源与Intel TBB(Threading Building Blocks)相关,这是一个开源的C++库,它提供了一系列模板类和函数,帮助开发者编写能够充分利用多核处理器性能的程序。TBB...

Global site tag (gtag.js) - Google Analytics