接上文,本章尝试在RV1106上使用TBB。依然是一言难尽,此文依然只是记录实践过程。
源码下载,编译TBB
下载地址: https://github.com/oneapi-src/oneTBB
版本使用 oneTBB-2021.11.0,这个版本可以使用cmake编译。
cmake配置完后,进入build目录,使用make指令,正常情况下应该一切正常,遗憾的是编译过程会报如下错误:
/media/oneTBB/src/tbb/../../include/oneapi/tbb/detail/_machine.h:328:5: error: 'fenv_t' does not name a type; did you mean 'dev_t'?fenv_t *my_fenv_ptr;^~~~~~dev_t
compilation terminated due to -Wfatal-errors
经查,fenv_t是跟硬件相关的浮点环境,起初我怀疑是未包含指定的头文件,于是在交叉编译工具链下找到fenv.h头文件加入到爆粗的部分,错误依旧。
然后发现是相关宏定义不存在,于是尝试单独验证fenv.h的有效性。
验证浮点环境的有效性
需要关注的点包括以下几个部分:
1、工具链应该包含支持C99标准的编译器(如gcc或clang),以及相应的库支持。
2、在交叉编译工具链中查找是否存在 <fenv.h>
头文件,这通常是存在于交叉编译链工具下
3、 - 编译时通过 -std=c99
或者 -std=gnu99
参数强制使用C99标准(如果是C++代码,确保编译器同时支持C++和C99混合编译)。
4、- 对于某些交叉编译环境,可能仍需要类似 _GLIBCXX_USE_C99_FENV_TR1
这样的宏定义来开启特定的浮点环境支持。
5、编写一个小测试程序来尝试使用 <fenv.h>
中的功能,并通过交叉编译工具链进行编译和链接,然后在目标平台上运行,以验证实际功能是否有效。
针对以上几点逐步检查后,写了如下代码进行编译验证:
tt.cpp
//#include "fenv.h"
#include <cfenv>
#include <iostream>
class cpu_ctl_env {fenv_t *my_fenv_ptr;
};
int main()
{int cc = 55;std::cout<<"cc " <<cc<<std::endl;//int cc = MAXTEST;//std::cout<<"Test cc"<< cc <<std::endl;return 0;
}
编译验证:
1、直接使用环境UBUNTU自带的指令
运行结果正常:
root@ubuntu:/media/test# g++ -std=c++11 -D_GLIBCXX_USE_C99_FENV_TR1=1 tt.cpp -o tt
root@ubuntu:/media/test# ./tt
cc 55
root@ubuntu:/media/test#
2、使用交叉编译工具链:
root@ubuntu:/media/test# /opt/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-g++ -std=c++11 -D_GLIBCXX_USE_C99_FENV_TR1=1 tt.cpp -o tt
In file included from tt.cpp:2:
/opt/toolchain/arm-rockchip830-linux-uclibcgnueabihf/arm-rockchip830-linux-uclibcgnueabihf/include/c++/8.3.0/cfenv:61:11: error: '::fenv_t' has not been declaredusing ::fenv_t;^~~~~~
/opt/toolchain/arm-rockchip830-linux-uclibcgnueabihf/arm-rockchip830-linux-uclibcgnueabihf/include/c++/8.3.0/cfenv:62:11: error: '::fexcept_t' has not been declaredusing ::fexcept_t;............
以上截取编辑结果前段显示,可以看到报出未定义的错误,检查交叉编译链工具里的头文cfenv件,可以看到fenv_t的定义就在其中,但无法编译通过。尝试添加命名空间using namespace std。改用<fenv.h>头文件,均报相同错误。
#ifndef _GLIBCXX_CFENV
#define _GLIBCXX_CFENV 1#pragma GCC system_header#if __cplusplus < 201103L
# include <bits/c++0x_warning.h>
#else#include <bits/c++config.h>#if _GLIBCXX_HAVE_FENV_H
# include <fenv.h>
#endif#ifdef _GLIBCXX_USE_C99_FENV_TR1#undef feclearexcept
#undef fegetexceptflag
#undef feraiseexcept
#undef fesetexceptflag
#undef fetestexcept
#undef fegetround
#undef fesetround
#undef fegetenv
#undef feholdexcept
#undef fesetenv
#undef feupdateenvnamespace std
{// typesusing ::fenv_t;using ::fexcept_t;// functionsusing ::feclearexcept;using ::fegetexceptflag;using ::feraiseexcept;using ::fesetexceptflag;using ::fetestexcept;using ::fegetround;using ::fesetround;using ::fegetenv;using ::feholdexcept;using ::fesetenv;using ::feupdateenv;
} // namespace std#endif // _GLIBCXX_USE_C99_FENV_TR1#endif // C++11#endif // _GLIBCXX_CFENV
至此这条路走不通,基本确认未RV1106不支持浮点环境,也就意味着无法使用TBB进行加速。药丸…只能手写线程加速,麻烦很啊。
TIPS:下一步将使用RV1126的交叉编译工具链进行测试,评估下RV1126是否支持该方法。