关于Intel Parallel Studio中TBB依赖GCC版本及编译报错的求助
一、报错原因判断:你的判断完全正确
从你给出的报错信息来看,这确实是高版本GCC对类型检查更严格导致的问题。
GCC 6.x系列对C++语法的类型兼容性检查比GCC 4.8要严苛很多,你遇到的ambiguous "?" operation错误,是因为TBB针对GCC4.8编写的代码中,三元运算符的两个操作数(tbb::internal::concurrent_vector_base_v3::size_type和tbb::atomic<unsigned long>)在GCC6下可以互相隐式转换,触发了编译器的歧义判断——而这种情况在GCC4.8中是被允许通过的。
你提供的TBB库目录明确是针对gcc4.8编译的,和本地的GCC6.3版本不匹配,这进一步坐实了问题根源。
二、让Parallel Studio适配高版本GCC的解决方案
这里提供几个可行的方案,按优先级排序:
1. 检查Parallel Studio是否自带高版本GCC适配的TBB库
Intel Parallel Studio通常会为多个GCC版本提供预编译的TBB库,你可以先去TBB的lib/intel64目录下看看有没有其他GCC版本的子目录(比如gcc6.3或者gcc6):
ls ~/usr/parallel_studio_xe_2020/compilers_and_libraries_2020/linux/tbb/lib/intel64/
如果存在对应GCC6的目录,只需要修改环境变量,让编译系统优先使用该目录下的库:
export LD_LIBRARY_PATH=~/usr/parallel_studio_xe_2020/compilers_and_libraries_2020/linux/tbb/lib/intel64/gcc6:$LD_LIBRARY_PATH export CPATH=~/usr/parallel_studio_xe_2020/compilers_and_libraries_2020/linux/tbb/include:$CPATH
之后重新编译你的项目即可。
2. 手动编译适配GCC6的TBB源码
如果Parallel Studio没有提供对应版本的预编译库,你可以自己编译TBB源码:
- 从Intel的TBB仓库获取和你Parallel Studio中版本一致的源码
- 使用本地的GCC6.3编译:
cd tbb-source-dir make CC=gcc CXX=g++ - 编译完成后,将生成的
.so库文件替换到Parallel Studio的TBB库目录中,或者直接在编译项目时指定新的TBB库路径:make TBB_INCLUDE_DIR=/path/to/compiled/tbb/include TBB_LIB_DIR=/path/to/compiled/tbb/lib/intel64
3. 使用Intel编译器(ICC)替代GCC编译项目
Intel Parallel Studio自带的ICC编译器对自家的TBB库兼容性最好,你可以切换到ICC来编译你的项目:
source ~/usr/parallel_studio_xe_2020/bin/compilervars.sh intel64 icpc -o your_project your_source.cpp -ltbb
这样可以避开GCC版本不兼容的问题。
附:你提供的原始信息
报错信息:
error: /usr/include/tbb/concurrent_vector.h(667): error: ambiguous "?" operation: second operand of type "tbb::internal::concurrent_vector_base_v3::size_type" can be converted to third operand type "tbb::atomic
", and vice versa
/usr/include/tbb/concurrent_vector.h(680): error: ambiguous "?" operation: second operand of type "tbb::internal::concurrent_vector_base_v3::size_type" can be converted to third operand type "tbb::atomic", and vice versa
2 errors detected in the compilation of "/tmp/tmpxft_00000d0e_00000000-4_gpu_handle.cpp4.ii".
make: *** [build/objs/cuda/tensor/gpu_handle.o] Error 2
TBB目录结构:
mm470@pc5-036-l:~/usr/parallel_studio_xe_2020/compilers_and_libraries_2020/linux/tbb/lib/intel64/gcc4.8 $ dir libtbb.so libtbb.so.2 libtbb_debug.so.2 libtbbmalloc.so libtbbmalloc.so.2 libtbbmalloc_debug.so.2
本地GCC版本:
mm470@pc5-036-l:~/usr/parallel_studio_xe_2020/compilers_and_libraries_2020/linux/tbb/lib/intel64/gcc4.8 $ gcc --version gcc (GCC) 6.3.1 20170216 (Red Hat 6.3.1-3) Copyright (C) 2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
内容的提问来源于stack exchange,提问作者mvictor

