本文总结了TBB的安装和常见使用方法。
TBB库的下载安装
- 在下载地址找到最新版适合的版本
- 运行安装程序
- 设置环境变量:
tbb\2021.10.0\include
加到INCLUDE
变量tbb\2021.10.0\lib\intel64\vc14
加到LIB
变量tbb\2021.10.0\redist\intel64\vc14
(含dll文件)加到PATH
变量
简单的测试例子
下面是一个摘自GitHub库中的例子,主要功能是查找一个字符串中的最长重复子字符串,并输出每个字符位置上的最长重复子字符串的长度和起始位置。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm> // std::max
#include "tbb/parallel_for.h"
#include "tbb/blocked_range.h"
static const std::size_t N = 23;
class SubStringFinder {
const std::string &str;
std::vector<std::size_t> &max_array;
std::vector<std::size_t> &pos_array;
public:
void operator()(const oneapi::tbb::blocked_range<std::size_t> &r) const {
for (std::size_t i = r.begin(); i != r.end(); ++i) {
std::size_t max_size = 0, max_pos = 0;
for (std::size_t j = 0; j < str.size(); ++j) {
if (j != i) {
std::size_t limit = str.size() - (std::max)(i, j);
for (std::size_t k = 0; k < limit; ++k) {
if (str[i + k] != str[j + k])
break;
if (k > max_size) {
max_size = k;
max_pos = j;
}
}
}
}
max_array[i] = max_size;
pos_array[i] = max_pos;
}
}
SubStringFinder(const std::string &s, std::vector<std::size_t> &m, std::vector<std::size_t> &p)
: str(s),
max_array(m),
pos_array(p) {}
};
int main(int argc, char *argv[]) {
std::string str[N] = { std::string("a"), std::string("b") };
for (std::size_t i = 2; i < N; ++i)
str[i] = str[i - 1] + str[i - 2];
std::string &to_scan = str[N - 1];
const std::size_t num_elem = to_scan.size();
std::vector<std::size_t> max(num_elem);
std::vector<std::size_t> pos(num_elem);
oneapi::tbb::parallel_for(oneapi::tbb::blocked_range<std::size_t>(0, num_elem),
SubStringFinder(to_scan, max, pos));
for (std::size_t i = 0; i < num_elem; ++i)
std::cout << " " << max[i] << "(" << pos[i] << ")"
<< "\n";
return 0;
}
- 在Windows使用Microsoft Visual C++ Build Tools的参考编译命令:
cl.exe /EHsc tbbtest.cpp /link tbb12.lib