接上文,本章尝试在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 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。改用<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 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是否支持该方法。
原文地址:https://blog.csdn.net/lez1021/article/details/135966945
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_66495.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!