本文关于基于github源码编译tbb生成动态库,并在cmake中使用
步骤一: 编译tbb并生成shared library
在github下载项目源码
git clone git@github.com:oneapi-src/oneTBB.git
cd oneTBB
mkdir build && cd build开始编译
参考:
cmake -G Ninja -S . -B build-shared -DBUILD_SHARED_LIBS=YES -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=-DTBB_ALLOCATOR_TRAITS_BROKEN
cmake --build build-shared
cmake --install build-shared --prefix _install
执行完成后,在build文件夹里可以看到新生成的文件夹

动态库生成。
步骤二:通过cmakelists建立链接

项目如上图结构组织,具体内容如下
CMakeLists.txt
cmake_minimum_required(VERSION 2.8.9)
project (hello_tbb)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++11 -fpermissive -Wall -Werror -O2 -Wno-deprecated -Wno-deprecated-declarations")
add_executable(hello_tbb main.cpp)
#target_include_directories(hello_tbb PUBLIC ${CMAKE_HOME_DIRECTORY}/third_party/opencv-3.4.3/16.04/include)
#target_link_directories(hello_tbb PUBLIC ${CMAKE_HOME_DIRECTORY}/third_party/opencv-3.4.3/16.04/lib)
target_include_directories(hello_tbb PUBLIC ${CMAKE_HOME_DIRECTORY}/third_party/tbb_lib/include)
target_link_directories(hello_tbb PUBLIC ${CMAKE_HOME_DIRECTORY}/third_party/tbb_lib/lib)
#set(OpenCV_LIBS
# opencv_ml opencv_highgui opencv_imgproc opencv_calib3d
# opencv_features2d opencv_imgcodecs opencv_videoio opencv_video
# opencv_aruco opencv_ccalib opencv_hdf opencv_core)
target_link_libraries(hello_tbb tbb)
#target_link_libraries(hello_tbb PUBLIC ${OpenCV_LIBS})
main.cpp
#include <iostream>
#include <random>
#include <chrono>
#include <cmath>
#include <tbb/tbb.h>
inline double calculate_objective_value(double x)
{
return std::sin(x);
}
inline double calculate_derivative_value(double x)
{
return std::cos(x);
}
int main()
{
std::random_device seed;
std::default_random_engine engine(seed());
std::uniform_real_distribution<double> uniform_dist(0.0, 10.0);
constexpr int num_elements = 1000000;
std::vector<double> x_optimal(num_elements);
auto perform_gradient_descent = [&](int i)
{
constexpr double epsilon = 1e-15;
constexpr double rate = 0.99;
double a = 0.50;
double x = uniform_dist(engine);
while (true)
{
const double delta = a * calculate_derivative_value(x);
x -= delta;
a *= rate;
if (delta < epsilon) { break; }
}
x_optimal[i] = x;
};
const auto t_0 = std::chrono::system_clock::now();
tbb::parallel_for(0, num_elements, perform_gradient_descent);
const auto t_1 = std::chrono::system_clock::now();
for (int i = 0; i < num_elements; ++ i) { perform_gradient_descent(i); }
const auto t_2 = std::chrono::system_clock::now();
const int elapsed_time_parallel = std::chrono::duration_cast<std::chrono::milliseconds>(t_1 - t_0).count();
const int elapsed_time_serial = std::chrono::duration_cast<std::chrono::milliseconds>(t_2 - t_1).count();
std::cout << "parallel: " << elapsed_time_parallel << " [ms]" << std::endl;
std::cout << "serial: " << elapsed_time_serial << " [ms]" << std::endl;
return 0;
使用cmakelists编译成功后,运行OK
![]()
利用ldd检查一下可执行文件的链接关系,tbb链接位置正确,符合预期

版权声明:本文为m0_47096428原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。