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. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值