ошибка: не удалось вызвать inlining - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь реализовать и кодировать некоторые файлы, некоторые из которых содержат SIMD-вызовы.Я скомпилировал этот код на сервере, работающем в основном в той же ОС, что и моя машина, но я не могу скомпилировать его.

Это ошибка:

make
g++ main.cpp -march=native -o main -fopenmp
In file included from /usr/lib/gcc/x86_64-linux-gnu/7/include/immintrin.h:53:0,
                 from tensor.hpp:9,
                 from main.cpp:4:
/usr/lib/gcc/x86_64-linux-gnu/7/include/avx512vlintrin.h: In function ‘_ZN6TensorIdE8add_avx2ERKS0_._omp_fn.5’:
/usr/lib/gcc/x86_64-linux-gnu/7/include/avx512vlintrin.h:447:1: error: inlining failed in call to always_inline ‘__m256d _mm256_mask_add_pd(__m256d, __mmask8, __m256d, __m256d)’: target specific option mismatch
 _mm256_mask_add_pd (__m256d __W, __mmask8 __U, __m256d __A,
 ^~~~~~~~~~~~~~~~~~
In file included from main.cpp:4:0:
tensor.hpp:228:33: note: called from here
         res = _mm256_mask_add_pd(tmp, 0xFF, _mm256_mask_loadu_pd(tmp, 0xFF, &elements[i]), _mm256_mask_loadu_pd(tmp, 0xFF, &a.elements[i]));
               ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/7/include/immintrin.h:53:0,
                 from tensor.hpp:9,
                 from main.cpp:4:
/usr/lib/gcc/x86_64-linux-gnu/7/include/avx512vlintrin.h:610:1: error: inlining failed in call to always_inline ‘__m256d _mm256_mask_loadu_pd(__m256d, __mmask8, const void*)’: target specific option mismatch
 _mm256_mask_loadu_pd (__m256d __W, __mmask8 __U, void const *__P)
 ^~~~~~~~~~~~~~~~~~~~
In file included from main.cpp:4:0:
tensor.hpp:228:33: note: called from here
         res = _mm256_mask_add_pd(tmp, 0xFF, _mm256_mask_loadu_pd(tmp, 0xFF, &elements[i]), _mm256_mask_loadu_pd(tmp, 0xFF, &a.elements[i]));
               ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/7/include/immintrin.h:53:0,
                 from tensor.hpp:9,
                 from main.cpp:4:
/usr/lib/gcc/x86_64-linux-gnu/7/include/avx512vlintrin.h:610:1: error: inlining failed in call to always_inline ‘__m256d _mm256_mask_loadu_pd(__m256d, __mmask8, const void*)’: target specific option mismatch
 _mm256_mask_loadu_pd (__m256d __W, __mmask8 __U, void const *__P)
 ^~~~~~~~~~~~~~~~~~~~
In file included from main.cpp:4:0:
tensor.hpp:228:33: note: called from here
         res = _mm256_mask_add_pd(tmp, 0xFF, _mm256_mask_loadu_pd(tmp, 0xFF, &elements[i]), _mm256_mask_loadu_pd(tmp, 0xFF, &a.elements[i]));
               ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Makefile:7: recipe for target 'main' failed
make: *** [main] Error 1

Поиск в Google проблемы не помог, поскольку все ответы указывают, я уже делаю / пробовал.

Может кто-нибудь предоставить некоторыефон, почему это не работает.

РЕДАКТИРОВАТЬ:

int main(){
#ifdef __AVX512F___
    auto tt = createTensor();
    auto tt2 = createTensor();
    auto res = tt.addAVX512(tt2);
#endif
}

//This is in tensor.hpp
#ifdef __AVX512F__
Tensor<T> Tensor::addAVX512(_param_){
   res = _mm256_mask_add_pd(tmp, 0xFF, _mm256_mask_loadu_pd(tmp, 0xFF, &elements[i]), _mm256_mask_loadu_pd(tmp, 0xFF, &a.elements[i]));
}
#endif

Это суть того, что происходит ... Я заключил все SIMDcall в #ifdefs и т. д.

1 Ответ

0 голосов
/ 12 февраля 2019

GCC позволяет использовать встроенные функции только для тех наборов команд, которые включены для использования компилятором.например, связанный с этим вопрос о внутреннем AVX1: не удалось выполнить вставку при вызове always_inline '__m256d _mm256_broadcast_sd (const double *)'


Это _mask_ версии 256-битные встроенные функции, они требуют AVX512VL.

(Мои комментарии по вопросу о -mavx были неправильными, я не заметил _mask в названии или аргументах, только _mm256.)

Вы, вероятно, компилируете на своем сервере KNL (Knight's Landing / Xeon Phi), который имеет AVX512F, но не AVX512VL.Таким образом, -march=native установит -mavx512f.(В отличие от Skylake-AVX512, который имеет AVX512VL, позволяющий использовать новые классные AVX512, такие как маскированные инструкции с более узкими векторами.)

И вы нашли ошибку в tensor.hpp, где вы используете AVX512VLвстроенные функции после проверки только на __AVX512F__ вместо __AVX512VL__. AVX512-все подразумевает 512F, поэтому не нужно проверять оба.

#ifdef __AVX512F__    // should be __AVX512VL__
Tensor<T> Tensor::addAVX512(_param_){
   res = _mm256_mask_add_pd(tmp, 0xFF, _mm256_mask_loadu_pd(tmp, 0xFF, &elements[i]), _mm256_mask_loadu_pd(tmp, 0xFF, &a.elements[i]));
}
#endif

Это просто бессмысленно, вы неНе нужно использовать маскированные версии этих встроенных функций, если вы собираетесь использовать постоянные маски «все единицы».Используйте _mm256_add_pd как обычный человек и проверяйте только на __AVX__.Или используйте _mm512_add_pd.

Сначала я подумал, что это от TensorFlow, но (из ваших комментариев) это не имеет смысла.И это не может быть так плохо написано. Слияние маски в 3 копии одного и того же tmp с полностью истинной маской просто не имеет смысла ;это выглядит как глупый способ ввести ложную зависимость, если компилятор не может оптимизировать маску = все-в-немаскированную нагрузку.

А также ужасный стиль C ++: у вас есть переменная с именем __m256d tmpкак глобальный или член класса ??Это даже не локальная фиктивная переменная, она может существовать там, где компилятор не может полностью ее оптимизировать.

...