Intel TBB

 

本文总结了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

相关链接