rhasspy / webrtc-noise-gain

Tiny wrapper around webrtc-audio-processing for noise suppression/auto gain only
MIT License
10 stars 17 forks source link

SIGILL on import #3

Closed Jc2k closed 9 months ago

Jc2k commented 9 months ago

On amd64 this builds OK but on importing I get an illegal instruction error. Here it is under gdb:

>>> from webrtc_noise_gain import AudioProcessor

Program received signal SIGILL, Illegal instruction.
0x00007ffff7619093 in pybind11::detail::get_internals() () from /home/john/webrtc-noise-gain/venv/lib/python3.9/site-packages/webrtc_noise_gain_cpp.cpython-39-x86_64-linux-gnu.so
(gdb) bt
#0  0x00007ffff7619093 in pybind11::detail::get_internals() () from /home/john/webrtc-noise-gain/venv/lib/python3.9/site-packages/webrtc_noise_gain_cpp.cpython-39-x86_64-linux-gnu.so
#1  0x00007ffff761294c in PyInit_webrtc_noise_gain_cpp () from /home/john/webrtc-noise-gain/venv/lib/python3.9/site-packages/webrtc_noise_gain_cpp.cpython-39-x86_64-linux-gnu.so
#2  0x000000000061a317 in ?? ()
#3  0x00000000005298c4 in ?? ()
#4  0x0000000000517b9b in _PyEval_EvalFrameDefault ()
#5  0x00000000005106ed in ?? ()
#6  0x0000000000528d21 in _PyFunction_Vectorcall ()
#7  0x0000000000516e76 in _PyEval_EvalFrameDefault ()
#8  0x0000000000528b63 in _PyFunction_Vectorcall ()
#9  0x0000000000512192 in _PyEval_EvalFrameDefault ()
#10 0x0000000000528b63 in _PyFunction_Vectorcall ()
#11 0x0000000000511fb5 in _PyEval_EvalFrameDefault ()
#12 0x0000000000528b63 in _PyFunction_Vectorcall ()
#13 0x0000000000511fb5 in _PyEval_EvalFrameDefault ()
#14 0x0000000000528b63 in _PyFunction_Vectorcall ()
#15 0x0000000000511fb5 in _PyEval_EvalFrameDefault ()
#16 0x0000000000528b63 in _PyFunction_Vectorcall ()
#17 0x000000000052842e in ?? ()
#18 0x000000000053f559 in _PyObject_CallMethodIdObjArgs ()
#19 0x000000000053e786 in PyImport_ImportModuleLevelObject ()
#20 0x00000000005144bd in _PyEval_EvalFrameDefault ()
#21 0x00000000005106ed in ?? ()
#22 0x0000000000510497 in _PyEval_EvalCodeWithName ()
#23 0x00000000005f5be3 in PyEval_EvalCode ()
#24 0x00000000005fa670 in ?? ()
#25 0x00000000005298c4 in ?? ()
#26 0x0000000000517b9b in _PyEval_EvalFrameDefault ()
#27 0x00000000005106ed in ?? ()
#28 0x0000000000528d21 in _PyFunction_Vectorcall ()
#29 0x0000000000516e76 in _PyEval_EvalFrameDefault ()
#30 0x0000000000528b63 in _PyFunction_Vectorcall ()
#31 0x0000000000512192 in _PyEval_EvalFrameDefault ()
#32 0x0000000000528b63 in _PyFunction_Vectorcall ()
#33 0x0000000000511fb5 in _PyEval_EvalFrameDefault ()
#34 0x0000000000528b63 in _PyFunction_Vectorcall ()
#35 0x0000000000511fb5 in _PyEval_EvalFrameDefault ()
#36 0x0000000000528b63 in _PyFunction_Vectorcall ()
#37 0x000000000052842e in ?? ()
#38 0x000000000053f559 in _PyObject_CallMethodIdObjArgs ()
#39 0x000000000053e786 in PyImport_ImportModuleLevelObject ()
#40 0x00000000005144bd in _PyEval_EvalFrameDefault ()
#41 0x00000000005106ed in ?? ()
#42 0x0000000000510497 in _PyEval_EvalCodeWithName ()
#43 0x00000000005f5be3 in PyEval_EvalCode ()
#44 0x0000000000619de7 in ?? ()
#45 0x0000000000615610 in ?? ()
#46 0x0000000000459cb3 in ?? ()
#47 0x0000000000459911 in PyRun_InteractiveLoopFlags ()
#48 0x00000000006194f5 in PyRun_AnyFileExFlags ()
#49 0x000000000044bca9 in ?? ()
#50 0x00000000005ea6e9 in Py_BytesMain ()
#51 0x00007ffff7c50d0a in __libc_start_main (main=0x5ea6b0, argc=1, argv=0x7fffffffe4f8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe4e8) at ../csu/libc-start.c:308
#52 0x00000000005ea5ea in _start ()

2023.10.0b1 is also failing to start for me with an illegal instruction.

Jc2k commented 9 months ago

Disassembly near the crash site:

   0x00007ffff7619012 <+306>:   call   0x7ffff760b980 <PyGILState_Release@plt>
   0x00007ffff7619017 <+311>:   jmp    0x7ffff7618f10 <_ZN8pybind116detail13get_internalsEv+48>
   0x00007ffff761901c <+316>:   nopl   0x0(%rax)
   0x00007ffff7619020 <+320>:   mov    0xe5f99(%rip),%rax        # 0x7ffff76fefc0
   0x00007ffff7619027 <+327>:   lea    0xa58b2(%rip),%rsi        # 0x7ffff76be8e0
   0x00007ffff761902e <+334>:   mov    (%rax),%rdi
   0x00007ffff7619031 <+337>:   call   0x7ffff7614520 <_ZN8pybind1110raise_fromEP7_objectPKc>
   0x00007ffff7619036 <+342>:   movq   $0x0,0xe6f07(%rip)        # 0x7ffff76fff48 <_ZZN8pybind116detail16get_internals_ppEvE12internals_pp>
   0x00007ffff7619041 <+353>:   subq   $0x1,(%r12)
   0x00007ffff7619046 <+358>:   jne    0x7ffff7619064 <_ZN8pybind116detail13get_internalsEv+388>
   0x00007ffff7619048 <+360>:   nopl   0x0(%rax,%rax,1)
   0x00007ffff7619050 <+368>:   mov    %r12,%rdi
   0x00007ffff7619053 <+371>:   call   0x7ffff760b510 <_Py_Dealloc@plt>
   0x00007ffff7619058 <+376>:   mov    0xe6ee9(%rip),%rbx        # 0x7ffff76fff48 <_ZZN8pybind116detail16get_internals_ppEvE12internals_pp>
   0x00007ffff761905f <+383>:   test   %rbx,%rbx
   0x00007ffff7619062 <+386>:   jne    0x7ffff7618fe4 <_ZN8pybind116detail13get_internalsEv+260>
   0x00007ffff7619064 <+388>:   mov    $0x8,%edi
   0x00007ffff7619069 <+393>:   call   0x7ffff760b710 <_Znwm@plt>
   0x00007ffff761906e <+398>:   movq   $0x0,(%rax)
   0x00007ffff7619075 <+405>:   mov    %rax,%rbx
   0x00007ffff7619078 <+408>:   mov    %rax,0xe6ec9(%rip)        # 0x7ffff76fff48 <_ZZN8pybind116detail16get_internals_ppEvE12internals_pp>
   0x00007ffff761907f <+415>:   mov    $0x1d8,%edi
   0x00007ffff7619084 <+420>:   call   0x7ffff760b710 <_Znwm@plt>
   0x00007ffff7619089 <+425>:   mov    %rax,%rdx
   0x00007ffff761908c <+428>:   mov    $0x3b,%ecx
   0x00007ffff7619091 <+433>:   xor    %eax,%eax
=> 0x00007ffff7619093 <+435>:   vmovss 0xa6bb1(%rip),%xmm0        # 0x7ffff76bfc4c
   0x00007ffff761909b <+443>:   mov    %rdx,%rdi
   0x00007ffff761909e <+446>:   rep stos %rax,%es:(%rdi)
   0x00007ffff76190a1 <+449>:   lea    0x30(%rdx),%rax
   0x00007ffff76190a5 <+453>:   vmovss %xmm0,0x20(%rdx)
   0x00007ffff76190aa <+458>:   mov    %rax,(%rdx)
   0x00007ffff76190ad <+461>:   lea    0x68(%rdx),%rax

The vmoss is an AVX instruction. So the changes in 1.2.2 haven't stopped AVX instructions getting emitted.

Jc2k commented 9 months ago

Initial thought was maybe that -mfma implies -mavx. So removing -mfma means that builds now fail let alone imports:

/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc: In member function ‘virtual void webrtc::FIRFilterAVX2::Filter(const float*, size_t, float*)’:
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:61:38: warning: AVX vector return without AVX enabled changes the ABI [-Wpsabi]
   61 |     __m256 m_sum = _mm256_setzero_ps();
      |                                      ^
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:51,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/avxintrin.h:1228:1: error: inlining failed in call to ‘always_inline’ ‘__m256 _mm256_setzero_ps()’: target specific option mismatch
 1228 | _mm256_setzero_ps (void)
      | ^~~~~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:61:37: note: called from here
   61 |     __m256 m_sum = _mm256_setzero_ps();
      |                    ~~~~~~~~~~~~~~~~~^~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:111,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/fmaintrin.h:63:1: error: inlining failed in call to ‘always_inline’ ‘__m256 _mm256_fmadd_ps(__m256, __m256, __m256)’: target specific option mismatch
   63 | _mm256_fmadd_ps (__m256 __A, __m256 __B, __m256 __C)
      | ^~~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:69:32: note: called from here
   69 |         m_sum = _mm256_fmadd_ps(m_in, _mm256_load_ps(coef_ptr + j), m_sum);
      |                 ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:51,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/avxintrin.h:872:1: error: inlining failed in call to ‘always_inline’ ‘__m256 _mm256_load_ps(const float*)’: target specific option mismatch
  872 | _mm256_load_ps (float const *__P)
      | ^~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:69:32: note: called from here
   69 |         m_sum = _mm256_fmadd_ps(m_in, _mm256_load_ps(coef_ptr + j), m_sum);
      |                 ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:51,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/avxintrin.h:896:1: error: inlining failed in call to ‘always_inline’ ‘__m256 _mm256_loadu_ps(const float*)’: target specific option mismatch
  896 | _mm256_loadu_ps (float const *__P)
      | ^~~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:68:31: note: called from here
   68 |         m_in = _mm256_loadu_ps(in_ptr + j);
      |                ~~~~~~~~~~~~~~~^~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:111,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/fmaintrin.h:63:1: error: inlining failed in call to ‘always_inline’ ‘__m256 _mm256_fmadd_ps(__m256, __m256, __m256)’: target specific option mismatch
   63 | _mm256_fmadd_ps (__m256 __A, __m256 __B, __m256 __C)
      | ^~~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:74:32: note: called from here
   74 |         m_sum = _mm256_fmadd_ps(m_in, _mm256_load_ps(coef_ptr + j), m_sum);
      |                 ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:51,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/avxintrin.h:872:1: error: inlining failed in call to ‘always_inline’ ‘__m256 _mm256_load_ps(const float*)’: target specific option mismatch
  872 | _mm256_load_ps (float const *__P)
      | ^~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:74:32: note: called from here
   74 |         m_sum = _mm256_fmadd_ps(m_in, _mm256_load_ps(coef_ptr + j), m_sum);
      |                 ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:51,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/avxintrin.h:872:1: error: inlining failed in call to ‘always_inline’ ‘__m256 _mm256_load_ps(const float*)’: target specific option mismatch
  872 | _mm256_load_ps (float const *__P)
      | ^~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:73:30: note: called from here
   73 |         m_in = _mm256_load_ps(in_ptr + j);
      |                ~~~~~~~~~~~~~~^~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:51,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/avxintrin.h:517:1: error: inlining failed in call to ‘always_inline’ ‘__m128 _mm256_extractf128_ps(__m256, int)’: target specific option mismatch
  517 | _mm256_extractf128_ps (__m256 __X, const int __N)
      | ^~~~~~~~~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:77:33: note: called from here
   77 |     __m128 m128_sum = _mm_add_ps(_mm256_extractf128_ps(m_sum, 0),
      |                       ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   78 |                                  _mm256_extractf128_ps(m_sum, 1));
      |                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:51,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/avxintrin.h:517:1: error: inlining failed in call to ‘always_inline’ ‘__m128 _mm256_extractf128_ps(__m256, int)’: target specific option mismatch
  517 | _mm256_extractf128_ps (__m256 __X, const int __N)
      | ^~~~~~~~~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:77:33: note: called from here
   77 |     __m128 m128_sum = _mm_add_ps(_mm256_extractf128_ps(m_sum, 0),
      |                       ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   78 |                                  _mm256_extractf128_ps(m_sum, 1));
      |                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:51,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/avxintrin.h:1228:1: error: inlining failed in call to ‘always_inline’ ‘__m256 _mm256_setzero_ps()’: target specific option mismatch
 1228 | _mm256_setzero_ps (void)
      | ^~~~~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:61:37: note: called from here
   61 |     __m256 m_sum = _mm256_setzero_ps();
      |                    ~~~~~~~~~~~~~~~~~^~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:51,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/avxintrin.h:1228:1: error: inlining failed in call to ‘always_inline’ ‘__m256 _mm256_setzero_ps()’: target specific option mismatch
 1228 | _mm256_setzero_ps (void)
      | ^~~~~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:61:37: note: called from here
   61 |     __m256 m_sum = _mm256_setzero_ps();
      |                    ~~~~~~~~~~~~~~~~~^~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:111,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/fmaintrin.h:63:1: error: inlining failed in call to ‘always_inline’ ‘__m256 _mm256_fmadd_ps(__m256, __m256, __m256)’: target specific option mismatch
   63 | _mm256_fmadd_ps (__m256 __A, __m256 __B, __m256 __C)
      | ^~~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:69:32: note: called from here
   69 |         m_sum = _mm256_fmadd_ps(m_in, _mm256_load_ps(coef_ptr + j), m_sum);
      |                 ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:51,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/avxintrin.h:872:1: error: inlining failed in call to ‘always_inline’ ‘__m256 _mm256_load_ps(const float*)’: target specific option mismatch
  872 | _mm256_load_ps (float const *__P)
      | ^~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:69:32: note: called from here
   69 |         m_sum = _mm256_fmadd_ps(m_in, _mm256_load_ps(coef_ptr + j), m_sum);
      |                 ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:51,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/avxintrin.h:896:1: error: inlining failed in call to ‘always_inline’ ‘__m256 _mm256_loadu_ps(const float*)’: target specific option mismatch
  896 | _mm256_loadu_ps (float const *__P)
      | ^~~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:68:31: note: called from here
   68 |         m_in = _mm256_loadu_ps(in_ptr + j);
      |                ~~~~~~~~~~~~~~~^~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:111,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/fmaintrin.h:63:1: error: inlining failed in call to ‘always_inline’ ‘__m256 _mm256_fmadd_ps(__m256, __m256, __m256)’: target specific option mismatch
   63 | _mm256_fmadd_ps (__m256 __A, __m256 __B, __m256 __C)
      | ^~~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:74:32: note: called from here
   74 |         m_sum = _mm256_fmadd_ps(m_in, _mm256_load_ps(coef_ptr + j), m_sum);
      |                 ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:51,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/avxintrin.h:872:1: error: inlining failed in call to ‘always_inline’ ‘__m256 _mm256_load_ps(const float*)’: target specific option mismatch
  872 | _mm256_load_ps (float const *__P)
      | ^~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:74:32: note: called from here
   74 |         m_sum = _mm256_fmadd_ps(m_in, _mm256_load_ps(coef_ptr + j), m_sum);
      |                 ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:51,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/avxintrin.h:872:1: error: inlining failed in call to ‘always_inline’ ‘__m256 _mm256_load_ps(const float*)’: target specific option mismatch
  872 | _mm256_load_ps (float const *__P)
      | ^~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:73:30: note: called from here
   73 |         m_in = _mm256_load_ps(in_ptr + j);
      |                ~~~~~~~~~~~~~~^~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:51,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/avxintrin.h:517:1: error: inlining failed in call to ‘always_inline’ ‘__m128 _mm256_extractf128_ps(__m256, int)’: target specific option mismatch
  517 | _mm256_extractf128_ps (__m256 __X, const int __N)
      | ^~~~~~~~~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:77:33: note: called from here
   77 |     __m128 m128_sum = _mm_add_ps(_mm256_extractf128_ps(m_sum, 0),
      |                       ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   78 |                                  _mm256_extractf128_ps(m_sum, 1));
      |                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/10/include/immintrin.h:51,
                 from /home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:13:
/usr/lib/gcc/x86_64-linux-gnu/10/include/avxintrin.h:517:1: error: inlining failed in call to ‘always_inline’ ‘__m128 _mm256_extractf128_ps(__m256, int)’: target specific option mismatch
  517 | _mm256_extractf128_ps (__m256 __X, const int __N)
      | ^~~~~~~~~~~~~~~~~~~~~
/home/john/webrtc-noise-gain/webrtc-audio-processing/webrtc-audio-processing-1/common_audio/fir_filter_avx2.cc:77:33: note: called from here
   77 |     __m128 m128_sum = _mm_add_ps(_mm256_extractf128_ps(m_sum, 0),
      |                       ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   78 |                                  _mm256_extractf128_ps(m_sum, 1));
      |                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Traceback (most recent call last):
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/unixccompiler.py", line 185, in _compile
    self.spawn(compiler_so + cc_args + [src, '-o', obj] + extra_postargs)
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/ccompiler.py", line 1041, in spawn
    spawn(cmd, dry_run=self.dry_run, **kwargs)
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/spawn.py", line 70, in spawn
    raise DistutilsExecError(
setuptools._distutils.errors.DistutilsExecError: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/john/webrtc-noise-gain/venv/lib/python3.9/site-packages/pyproject_hooks/_in_process/_in_process.py", line 353, in <module>
    main()
  File "/home/john/webrtc-noise-gain/venv/lib/python3.9/site-packages/pyproject_hooks/_in_process/_in_process.py", line 335, in main
    json_out['return_val'] = hook(**hook_input['kwargs'])
  File "/home/john/webrtc-noise-gain/venv/lib/python3.9/site-packages/pyproject_hooks/_in_process/_in_process.py", line 251, in build_wheel
    return _build_backend().build_wheel(wheel_directory, config_settings,
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/build_meta.py", line 434, in build_wheel
    return self._build_with_temp_dir(
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/build_meta.py", line 419, in _build_with_temp_dir
    self.run_setup()
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/build_meta.py", line 507, in run_setup
    super(_BuildMetaLegacyBackend, self).run_setup(setup_script=setup_script)
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/build_meta.py", line 341, in run_setup
    exec(code, locals())
  File "<string>", line 565, in <module>
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/__init__.py", line 103, in setup
    return distutils.core.setup(**attrs)
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/core.py", line 185, in setup
    return run_commands(dist)
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/core.py", line 201, in run_commands
    dist.run_commands()
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/dist.py", line 969, in run_commands
    self.run_command(cmd)
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/dist.py", line 989, in run_command
    super().run_command(command)
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/dist.py", line 988, in run_command
    cmd_obj.run()
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/wheel/bdist_wheel.py", line 364, in run
    self.run_command("build")
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/cmd.py", line 318, in run_command
    self.distribution.run_command(command)
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/dist.py", line 989, in run_command
    super().run_command(command)
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/dist.py", line 988, in run_command
    cmd_obj.run()
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/command/build.py", line 131, in run
    self.run_command(cmd_name)
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/cmd.py", line 318, in run_command
    self.distribution.run_command(command)
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/dist.py", line 989, in run_command
    super().run_command(command)
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/dist.py", line 988, in run_command
    cmd_obj.run()
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/command/build_ext.py", line 88, in run
    _build_ext.run(self)
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/command/build_ext.py", line 345, in run
    self.build_extensions()
  File "<string>", line 513, in build_extensions
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/pybind11/setup_helpers.py", line 285, in build_extensions
    super().build_extensions()
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/command/build_ext.py", line 467, in build_extensions
    self._build_extensions_serial()
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/command/build_ext.py", line 493, in _build_extensions_serial
    self.build_extension(ext)
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/command/build_ext.py", line 249, in build_extension
    _build_ext.build_extension(self, ext)
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/command/build_ext.py", line 548, in build_extension
    objects = self.compiler.compile(
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/ccompiler.py", line 600, in compile
    self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
  File "<string>", line 500, in _compile
  File "/tmp/build-env-cu2edvn1/lib/python3.9/site-packages/setuptools/_distutils/unixccompiler.py", line 187, in _compile
    raise CompileError(msg)
setuptools._distutils.errors.CompileError: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1

ERROR Backend subprocess exited when trying to invoke build_wheel

And if you remove the files that don't compile from the build, then you get linker errors.

Jc2k commented 9 months ago

As i said on discord, it looks like upstream "solves" this issue by generating multiple static libraries with different features turned on and off. For example:

https://gitlab.freedesktop.org/pulseaudio/webrtc-audio-processing/-/blob/master/webrtc/common_audio/meson.build?ref_type=heads

Here common_audio_sse2 is built with common cflags and -msse2. common_audio_avx is built with common clags and -mavx2, -mfma. common_audio is built just with common cflags. These can be linked together without the avx2 optimisations "escaping" common_audio_avx.

AFAICT, we need to be able to do similar - the avx modules need to be built with avx, but the pybind stuff should not be built with avx. I have no idea how to do that with pybind11.

synesthesiam commented 9 months ago

I was able to remove -mfma entirely from the build by patching out AVX2 detection. We'll just have to live with non-optimal convolutions :cry: