首先下载:
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编译模式
-
-
-
-
-
-
#include"tbb/pipeline.h"
-
#include"tbb/tick_count.h"
-
#include"tbb/task_scheduler_init.h"
-
#include<cstring>
-
#include<cstdlib>
-
#include<cstdio>
-
#include<cctype>
-
usingnamespacestd;
-
-
classMyBuffer{
-
staticconstsize_tbuffer_size=10000;
-
char*my_end;
-
-
charstorage[1+buffer_size];
-
public:
-
-
char*begin(){returnstorage+1;}
-
constchar*begin()const{returnstorage+1;}
-
-
char*end()const{returnmy_end;}
-
-
voidset_end(char*new_ptr){my_end=new_ptr;}
-
-
size_tmax_size()const{returnbuffer_size;}
-
-
size_tsize()const{returnmy_end-begin();}
- };
-
classMyInputFilter:publictbb::filter{
-
public:
-
staticconstsize_tn_buffer=8;
- MyInputFilter(FILE*input_file_);
-
private:
- FILE*input_file;
- size_tnext_buffer;
-
charlast_char_of_previous_buffer;
- MyBufferbuffer[n_buffer];
-
void*operator()(void*);
- };
- MyInputFilter::MyInputFilter(FILE*input_file_):
-
filter(true),
- next_buffer(0),
- input_file(input_file_),
-
last_char_of_previous_buffer('')
- {
- }
-
void*MyInputFilter::operator()(void*){
- MyBuffer&b=buffer[next_buffer];
- next_buffer=(next_buffer+1)%n_buffer;
- size_tn=fread(b.begin(),1,b.max_size(),input_file);
-
if(!n){
-
-
returnNULL;
-
}else{
- b.begin()[-1]=last_char_of_previous_buffer;
- last_char_of_previous_buffer=b.begin()[n-1];
- b.set_end(b.begin()+n);
-
return&b;
- }
- }
-
-
classMyTransformFilter:publictbb::filter{
-
public:
- MyTransformFilter();
-
void*operator()(void*item);
- };
- MyTransformFilter::MyTransformFilter():
-
tbb::filter(false)
- {}
-
void*MyTransformFilter::operator()(void*item){
- MyBuffer&b=*static_cast<MyBuffer*>(item);
-
intprev_char_is_space=b.begin()[-1]=='';
-
for(char*s=b.begin();s!=b.end();++s){
-
if(prev_char_is_space&&islower((unsignedchar)*s))
- *s=toupper(*s);
-
prev_char_is_space=isspace((unsignedchar)*s);
- }
-
return&b;
- }
-
-
classMyOutputFilter:publictbb::filter{
- FILE*my_output_file;
-
public:
- MyOutputFilter(FILE*output_file);
-
void*operator()(void*item);
- };
- MyOutputFilter::MyOutputFilter(FILE*output_file):
-
tbb::filter(true),
- my_output_file(output_file)
- {
- }
-
void*MyOutputFilter::operator()(void*item){
- MyBuffer&b=*static_cast<MyBuffer*>(item);
- fwrite(b.begin(),1,b.size(),my_output_file);
-
returnNULL;
- }
-
staticintNThread=tbb::task_scheduler_init::automatic;
-
staticconstchar*InputFileName="input.txt";
-
staticconstchar*OutputFileName="output.txt";
-
staticboolis_number_of_threads_set=false;
-
voidUsage()
- {
-
fprintf(stderr,"Usage:\ttext_filter[input-file[output-file[nthread]]]\n");
- }
-
intParseCommandLine(intargc,char*argv[]){
-
-
if(argc>4){
- Usage();
-
return0;
- }
-
if(argc>=2)InputFileName=argv[1];
-
if(argc>=3)OutputFileName=argv[2];
-
if(argc>=4){
- NThread=strtol(argv[3],0,0);
-
if(NThread<1){
-
fprintf(stderr,"nthreadsetto%d,butmustbeatleast1\n",NThread);
-
return0;
- }
-
is_number_of_threads_set=true;
- }
-
return1;
- }
-
intrun_pipeline(intnthreads)
- {
-
FILE*input_file=fopen(InputFileName,"r");
-
if(!input_file){
- perror(InputFileName);
- Usage();
-
return0;
- }
-
FILE*output_file=fopen(OutputFileName,"w");
-
if(!output_file){
- perror(OutputFileName);
-
return0;
- }
-
- tbb::pipelinepipeline;
-
- MyInputFilterinput_filter(input_file);
- pipeline.add_filter(input_filter);
-
- MyTransformFiltertransform_filter;
- pipeline.add_filter(transform_filter);
-
- MyOutputFilteroutput_filter(output_file);
- pipeline.add_filter(output_filter);
-
- tbb::tick_countt0=tbb::tick_count::now();
- pipeline.run(MyInputFilter::n_buffer);
- tbb::tick_countt1=tbb::tick_count::now();
-
- pipeline.clear();
- fclose(output_file);
- fclose(input_file);
-
if(is_number_of_threads_set){
-
printf("threads=%dtime=%g\n",nthreads,(t1-t0).seconds());
-
}else{
-
if(nthreads==1){
-
printf("serialruntime=%g\n",(t1-t0).seconds());
-
}else{
-
printf("parallelruntime=%g\n",(t1-t0).seconds());
- }
- }
-
return1;
- }
-
intmain(intargc,char*argv[]){
-
if(!ParseCommandLine(argc,argv))
-
return1;
-
if(is_number_of_threads_set){
-
- tbb::task_scheduler_initinit(NThread);
-
if(!run_pipeline(NThread))
-
return1;
-
}else{
-
{
- tbb::task_scheduler_initinit_serial(1);
-
if(!run_pipeline(1))
-
return1;
- }
-
{
- tbb::task_scheduler_initinit_parallel;
-
if(!run_pipeline(0))
-
return1;
- }
- }
-
return0;
- }
第二个程序,对应debug模式,带上tbb_debug.lib:
-
#include"tbb/task_scheduler_init.h"
-
#include"tbb/blocked_range.h"
-
#include"tbb/parallel_for.h"
-
-
-
usingnamespacetbb;
-
-
voidFoo(floatvalue)
- {
-
printf("%.2f\n",value);
- }
-
classApplyFoo
- {
-
float*constmy_a;
-
public:
-
voidoperator()(constblocked_range<size_t>&r)const
- {
-
float*a=my_a;
-
for(size_ti=r.begin();i!=r.end();++i)
- Foo(a[i]);
- }
-
ApplyFoo(floata[]):my_a(a){}
- };
-
int_tmain(intargc,_TCHAR*argv[])
- {
-
-
- task_scheduler_initinit;
-
floata[100];
-
for(inti=0;i<100;i++)
-
a[i]=(float)i;
-
-
- parallel_for(blocked_range<size_t>(0,100),ApplyFoo(a));
-
return0;
- }
分享到:
相关推荐
**TBB多线程库详解** Intel的Threading Building Blocks(TBB)是一个高效、灵活的C++库,专门设计用于解决多核处理器环境下的并行编程问题。TBB库提供了一组高级接口,帮助开发者编写出可扩展、高性能的多线程应用...
在给定的“inteltbb.rar”压缩包中,包含了一系列资源,用于在Windows 7环境下,使用Visual Studio 2013编译和配置TBB库,以便与OpenCV等其他库共用。 **并行计算** 是现代计算机科学中的关键概念,特别是在多核...
TBB(Thread Building Blocks)是由Intel开发的一个开源库,全称为“线程构建模块”。它旨在提供一种高效、灵活的方式来管理和利用多核处理器的并行计算能力,使开发者能够更容易地编写出高性能、可扩展的多线程应用...
**Intel Threading Building Blocks (TBB) 线程构建模块** Intel Threading Building Blocks (TBB) 是Intel公司推出的一款强大的开源库,专门用于帮助C++开发者进行高效的并行编程。TBB的设计目标是简化多核处理器...
TBB库,全称为Threading Building Blocks,是由Intel公司开发的一款高效、易用的多线程编程库。它为C++程序员提供了一组丰富的模板类和函数,使得在多核处理器上实现并行计算变得简单而高效。20150424版本的TBB库是...
**Intel TBB(Threading Building Blocks)** 是一个强大的并行编程库,由Intel公司开发,采用标准C++编写,旨在提升多核处理器上的数据并行计算能力。TBB库的核心理念是提供一种抽象的方式,使得程序员可以更容易地...
TBB,全称为Threading Building Blocks,是由Intel开发的一个开源库,旨在简化多核处理器和多线程编程。它提供了一套C++模板类,用于高效地管理和执行并行任务,帮助开发者在CPU的多个核心上实现数据并行和任务并行...
TBB,Thread Building Blocks,线程构建模块,是Intel公司开发的并行编程开发的工具。 OSCON 上,Intel 宣布,Threading Building Blocks,Intel 众多软件开发工具中的一个,open source了。协议是 GPLv2。 TBB 获得过...
英特尔的Threading Building Blocks(TBB)库是实现并行计算的一种高效工具,尤其在多线程编程方面表现出色。TBB库提供了高级别的抽象,使得开发者能够更方便地利用多核处理器的性能,而无需深入理解底层的线程管理...
TBB,Thread Building Blocks,线程构建模块,是Intel公司开发的并行编程开发的工具。 OSCON 上,Intel 宣布,Threading Building Blocks,Intel 众多软件开发工具中的一个,open source了。协议是 GPLv2。 TBB 获得过...
TBB(Thread Building Blocks)是Intel开发的一个开源C++模板库,专为并行编程设计,旨在帮助开发者充分利用多核处理器的性能。TBB的主要目标是简化并行编程,提供高效、灵活的工具,使程序员可以更容易地创建可扩展...
Threading Building Blocks是由Intel开发的一个并行编程库,它提供了一种C++模板库,用于帮助开发者编写多线程应用程序。TBB的主要目标是简化并行编程,让开发者能够利用多核处理器的计算能力,提高程序性能,而无需...
Threading Building Blocks(TBB)是Intel开发的一个C++库,它提供了一组模板类和函数,帮助开发者轻松地编写高性能的并行代码,无需深入理解底层的线程管理细节。TBB的核心概念包括任务调度器、并行算法和数据并行...
标题 "tbb-tbb_2020.zip" 指示的是 Intel 的 Threading Building Blocks (TBB) 库的一个版本,这是针对 C++ 开发的并行编程框架,特别适用于优化多线程应用程序。在 OpenCV 中,TBB 被广泛使用来提升图像处理和...
TBB是一个C++库,它提供了并行算法、数据结构和线程管理工具,旨在帮助开发者充分利用多核处理器的性能。 描述中提到的“tbb_debug.dll”是TBB库的一个调试版本动态链接库。在开发过程中,调试版本的库通常包含额外...
**Intel TBB (Threading Building Blocks)** 是一个开源的并行编程库,由Intel公司开发,主要用于提升多核处理器上应用程序的性能。TBB的主要目标是简化并行编程,让开发者能够更容易地利用多核处理器的计算能力。在...
**正文** Intel TBB(Thread Building Blocks)是Intel公司推出的一款高效的并行编程库,专为多核处理器设计,旨在简化并行编程的...使用TBB,开发者可以更专注于解决业务问题,而不是关注底层的线程管理和同步细节。
《Intel Threading Building Blocks Tutorial》是一份详细的指南,旨在教授如何使用Intel的Threading Building Blocks (TBB)库来开发高效、多线程的应用程序。TBB是一个开源库,它为C++程序员提供了高级别的并行编程...
标题中的“tbb并行编程文件”指的是这个压缩包包含的资源与Intel TBB(Threading Building Blocks)相关,这是一个开源的C++库,它提供了一系列模板类和函数,帮助开发者编写能够充分利用多核处理器性能的程序。TBB...