TBB与OpenCV
- OpenCV中训练使用的多任务不是直接调用线程实现,而是使用TBB框架,线程构建块(TBB)可以轻松地编写并行C++程序,充分利用多核性能;具有可移植性、可组合性和可验证性。
下载与安装
- 下载地址:
https://github.com/intel/tbb/releases
- 安装比较简单:解压后可以直接使用,需要设置PATH,确保dll可以被执行。
例子与编译
- 代码-并行找出1-100之间的素数
#include<iostream>
#include<tbb/tbb.h>
using namespace std;
using namespace tbb;
int is_prime(int x)
{
int i;
if (x <= 1) { // 从2开始
return 0;
}
for (i = 2; i * i <= x; ++i) {
if (x % i == 0) { /*合数 */
return 0;
}
}
return 1;
}
class FindPrime {
public:
void operator() (const blocked_range < size_t > &r)const {
for (size_t i = r.begin(); i != r.end(); ++i) {
if (is_prime(i)) {
cout << i << " ";
}
}
}
};
int main(int argc, char *argv[])
{
size_t end = 100; // 默认找1-100之间素数
// 创建并行任务,每个任务处理一个素数的判定,并输出
parallel_for(blocked_range <size_t> (0, end), FindPrime());
cout << endl;
return 0;
}
- 编译脚本
INCLUDES = /I "C:\Program Files\tbb\include"
LIBS = /LIBPATH:"C:\Program Files\tbb\lib\intel64\vc14" \
/DYNAMICBASE \
"tbb.lib"
CL_ARGS = /EHsc \
/MDd \
/source-charset:utf-8 \
/execution-charset:utf-8 \
/nologo
LINK_ARGS = /DEBUG /MACHINE:X64 /NOLOGO
OUTFILE = main.exe
# SOURCE = tbb_main.cpp
SOURCE = tbb_prime.cpp
OBJS = tbb_main.obj
$(OUTFILE):$(SOURCE)
@cl /c $(CL_ARGS) /Fo:$(OBJS) $(INCLUDES) $(SOURCE)
@link $(LINK_ARGS) $(LIBS) /OUT:$(OUTFILE) $(OBJS)
clean:
@del *.obj *.exe *.pdb *.ilk 2>/Nul
- 计算结果
体验TBB的多任务
网友评论