AMD主机编译gcc-14后,Conan构建onetbb适配Intel目标CPU报错求助
解决方法
先试试修改Conan配置(无需重编译GCC)
你的问题本质是onetbb编译时默认检测主机AMD CPU的指令集,生成了主机不支持但目标Intel CPU支持的tpause指令。直接通过Conan强制指定目标CPU的编译参数即可:
方法1:用Conan的settings区分编译主机与目标CPU
构建时明确指定两个环境的CPU型号:conan install . -s:b compiler=gcc -s:b compiler.version=14 -s:h cpu=skylake-sp -s:b cpu=znver2其中
-s:h cpu=skylake-sp告诉Conan最终运行环境是Skylake-SP架构(对应Xeon Gold 6128);-s:b cpu=znver2让构建工具适配你的AMD EPYC 7742主机。方法2:直接传递编译器指令集参数
如果settings未生效,就强制给编译器添加-march和-mtune选项:conan install . -c tools.build:cflags="-march=skylake-sp -mtune=skylake-sp" -c tools.build:cxxflags="-march=skylake-sp -mtune=skylake-sp"这样onetbb编译时会直接生成Skylake-SP兼容的代码,跳过主机CPU检测,自然会包含
tpause这类目标支持的指令。
若Conan配置无效,再考虑重编译GCC
如果上述方法无法覆盖onetbb的内部检测逻辑,就重新编译GCC时默认适配目标CPU:
在GCC配置阶段添加针对Skylake-SP的参数:
../gcc-14/configure --prefix=/usr/local/gcc14 --host=x86_64-linux-gnu --build=x86_64-linux-gnu --target=x86_64-linux-gnu --with-cpu=skylake-sp --with-tune=skylake-sp --enable-languages=c,c++
这样编译出的GCC会默认生成Skylake-SP架构的代码,后续用它构建onetbb就不会再出现指令集不兼容的问题。
补充说明
tpause属于Intel WAITPKG指令集,AMD Zen2(你的主机CPU)不支持,但Intel Skylake-SP(目标CPU)支持。问题核心就是onetbb默认用主机CPU的指令集生成代码,所以只要强制指定目标CPU的架构参数就能解决,优先用Conan改配置,成本低见效快。
内容的提问来源于stack exchange,提问作者Sito
相关产品推荐
相关产品推荐

