Opencv(C++)学习 TBB与OPENMP的加速效果实验与ARM上的实践(三)

接上文,本章尝试在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、在交叉编译工具链中查找是否存在 头文件,这通常是存在于交叉编译链工具下
3、 - 编译时通过 -std=c99 或者 -std=gnu99 参数强制使用C99标准(如果是C++代码,确保编译器同时支持C++和C99混合编译)。
4、- 对于某些交叉编译环境,可能仍需要类似 _GLIBCXX_USE_C99_FENV_TR1 这样的宏定义来开启特定的浮点环境支持。
5、编写一个小测试程序来尝试使用 中的功能,并通过交叉编译工具链进行编译和链接,然后在目标平台上运行,以验证实际功能是否有效。

针对以上几点逐步检查后,写了如下代码进行编译验证:
tt.cpp

//#include "fenv.h"
#include 
#include 
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 <
	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 declared
   using ::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 declared
   using ::fexcept_t;
   ....
   ....
   ....

以上截取编辑结果前段显示,可以看到报出未定义的错误,检查交叉编译链工具里的头文cfenv件,可以看到fenv_t的定义就在其中,但无法编译通过。尝试添加命名空间using namespace std。改用头文件,均报相同错误。

#ifndef _GLIBCXX_CFENV
#define _GLIBCXX_CFENV 1

#pragma GCC system_header

#if __cplusplus < 201103L
# include 
#else

#include 

#if _GLIBCXX_HAVE_FENV_H
# include 
#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 feupdateenv

namespace std
{
  // types
  using ::fenv_t;
  using ::fexcept_t;

  // functions
  using ::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是否支持该方法。

你可能感兴趣的:(OpenCV学习笔记,opencv,c++,学习,arm开发)