非法指示加载libtensorflow_cc.so时,在nsync :: nsync_mu_initnsync :: nsync_mu_s_ *中为0x00007ffff3712210

问题描述

我的应用程序的一部分使用tensorflow加载模型。使用devtoolset-7使用tensorflow2.3编译应用程序代码。 尝试运行我的应用程序二进制文件时,使用堆栈跟踪加载libtensorflow_cc.so时会崩溃

template<class T,class... Args> struct child: parent_one<Args...> {};

template<class T,class A,class B> struct child<T,A,B>: parent_two<A,B> {};

template<class A,class B> struct child<one_t,B>: parent_one<A,B> {};

/ proc / cpuinfo中的标志是

flags:fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm const_tsc rep_good nopl xtopology nonstop_tsc eagerfpu pni pclmulqdq ssse3 f ma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dNowprefetch invpc id_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveop 塔拉特md_clear spec_ctrl intel_stibp arch_capabilities

有人可以帮助我了解其中的问题吗?

解决方法

tensor Flow在x86平台上大量使用AVX指令。如果二进制文件是使用zmm寄存器的AVX512编译的,则二进制文件可以在支持的硬件上运行。因此,根据要求通过注释检查指令集的注释,

  1. objdump -M intel -S /usr/lib64/libtensorflow.so.2 | grep -i zmm
  2. print $pc在GDB中隔离指令。

注意:根据从Broadwell(无AVX512)到Skylake(AVX512)的更新,此问题已解决。