在Clion IDE中使用Tbb库



我正在尝试在Clion IDE中运行此代码。我想使用TBB库。我使用C++11。

#include “tbb/blocked_range.h”
#include “tbb/parallel_for.h”
#include <vector>
const size_t SIZE = 10000000;
int main()
{
std::vector<double> myArray(SIZE);
tbb::parallel_for(tbb::blocked_range<size_t>(0, SIZE),
[&myArray](const tbb::blocked_range<size_t> &r)
{
for (size_t i = r.begin(); i != r.end(); i++)
Calculate(myArray[i]);
});
return 0;
}

从命令行:

g++ task1.cpp -o task1 -std=c++11 -fopenmp -ltbb

这段代码运行得很好。

但在克莱恩却不是。

我认为我的CMakeLists.txt文件有问题。

Clion告诉我的:

CMakeFiles/parallel.dir/main.cpp.o: In function `run':
/usr/include/tbb/parallel_reduce.h:148: undefined reference to `tbb::task_group_context::~task_group_context()'
/usr/include/tbb/parallel_reduce.h:148: undefined reference to `tbb::task_group_context::~task_group_context()'
CMakeFiles/parallel.dir/main.cpp.o:(.rodata+0xa0): undefined reference to `typeinfo for tbb::task'
CMakeFiles/parallel.dir/main.cpp.o:(.rodata+0x1c8): undefined reference to `tbb::task::note_affinity(unsigned short)'
CMakeFiles/parallel.dir/main.cpp.o: In function `tbb::task_group_context::task_group_context(tbb::task_group_context::kind_type, unsigned long)':
/usr/include/tbb/task.h:441: undefined reference to `tbb::task_group_context::init()'

CMakeLists.txt

cmake_minimum_required(VERSION 3.6) 
project(parallel) 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp -ltbb") 
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp main.cpp) 
add_executable(parallel ${SOURCE_FILES})

如何更改我的CMakeLists.txt文件,或者我应该做一些其他操作?谢谢你的帮助。

首先,您必须确保TBB设置正确。

TBB的当前版本是oneTBB。这是一个由英特尔支持的开源项目。旧版本的TBB在这里,但它会将您发送到新版本,oneTBB。所以,最好还是和新的一个呆在一起。

有两种方法可以获得oneTBB:要么从此处的oneTBB Github源代码(此处对此进行了解释),要么从这里的英特尔oneTBB。

我更喜欢英特尔,因为它提供了GUI安装程序(也为Linux提供了apt)。在使用GUI安装oneTBB之后,您必须设置环境,此处对此进行了解释。

您应该通过一个简单的代码来测试oneTBB设置。上面的网页提供了一个示例代码,为了方便起见,我用一个主要函数包装了它(注意附带的标题oneapi/tbb.h):

test.cpp

#include <iostream>
#include "oneapi/tbb.h"
int main(){
int sum = oneapi::tbb::parallel_reduce(oneapi::tbb::blocked_range<int>(1,101), 0,
[](oneapi::tbb::blocked_range<int> const& r, int init) -> int {
for (int v = r.begin(); v != r.end(); v++  ) {
init += v;
}
return init;
},
[](int lhs, int rhs) -> int {
return lhs + rhs;
}
);
std::cout << sum << 'n';
return 0;
}

编译时使用(如这里所解释的):

g++ -o test test.cpp $(pkg-config --libs --cflags tbb)

如果您的系统(gcc、oneTBB和其他系统)设置正确,这应该可以工作。

当涉及到CLion时,您将需要CMakeLists.txt文件。这里有oneTBB GitHub页面中的示例。例如,使用CLion打开test_all文件夹,就像打开一个项目一样。它应该从那里开始构建。通过查看示例项目的cmake文件,您可以创建自己的cmake文件。

更新:

  1. 请看这篇文章以及英特尔为oneTBB发布的文章
  2. 我已经为旧的TBB和oneTBB准备了示例文件,用于使用命令行GCC和CMAKE进行构建。CMAKE是CLion所需的

对于CLion和旧版本的TBB,这将是一个基本的CMAKE文件:

cmake_minimum_required(VERSION 3.xx)
project(testtbb)
set(CMAKE_CXX_STANDARD 17)
find_package(TBB REQUIRED)
add_executable(testtbb_long.out testtbb_long.cpp)
target_link_libraries(testtbb_long.out tbb)

请注意,要将TBB库链接到定义的可执行文件,需要使用target_link_libraries作为:

target_link_libraries(executable-name.out tbb)

您应该使用cmake测试来查找libtbb,它还设置了正确的变量。

github上有一个FindTBB,您可以尝试使用它。

最新更新