Недопустимый управляющий сигнал для стрелочного паркета. Как собрать с Conan без AVX2

Я использую conan для создания библиотеки, использующей стрелочный паркет. Я построил стрелу сам, потому что не смог найти версии в conan center, включающие паркет:

В моем conanfile.txt

[options]
arrow:shared=True  # I tried both shared and static
arrow:parquet=True
arrow:with_snappy=True
conan install .. --build=arrow

Он правильно строится и выполняется на моей машине, но не проходит тесты на сервере Jenkins с

 SIGILL - Illegal instruction signal

Из этого и это сообщение, похоже, что может быть конфликт архитектуры. И действительно, есть отличия:

Дженкинс сервер

AVX supported
AVX2 not supported

мой компьютер

AVX supported
AVX2 supported

Кроме того, код стрелки оптимизирован до уровня avx. Например, в byte_stream_split.h:

#if defined(ARROW_HAVE_AVX2)
template <typename T>
void ByteStreamSplitDecodeAvx2(const uint8_t* data, int64_t num_values, int64_t stride,
                               T* out)
// Code

Поскольку я не добавил поддержку AVX2, как мне сообщить Conan собрать стрелу без поддержки AVX2 или любой другой минимальной общей конфигурации?

Или есть что-то совершенно другое, на что я должен смотреть?


person JACH    schedule 27.07.2021    source источник


Ответы (1)


В стрелке уровень используемых инструкций SIMD контролируется этими параметры cmake

  define_option_string(ARROW_SIMD_LEVEL
                       "Compile-time SIMD optimization level"
                       "SSE4_2" # default to SSE4.2
                       "NONE"
                       "SSE4_2"
                       "AVX2"
                       "AVX512")

  define_option_string(ARROW_RUNTIME_SIMD_LEVEL
                       "Max runtime SIMD optimization level"
                       "MAX" # default to max supported by compiler
                       "NONE"
                       "SSE4_2"
                       "AVX2"
                       "AVX512"
                       "MAX")

Этот параметр используется здесь для проверки следует ли передавать определения препроцессора

  if(CXX_SUPPORTS_AVX2 AND ARROW_RUNTIME_SIMD_LEVEL MATCHES "^(AVX2|AVX512|MAX)$")
    set(ARROW_HAVE_RUNTIME_AVX2 ON)
    add_definitions(-DARROW_HAVE_RUNTIME_AVX2 -DARROW_HAVE_RUNTIME_BMI2)
  endif()

Вы можете указать эту опцию cmake, ARROW_SIMD_LEVEL и ARROW_RUNTIME_SIMD_LEVEL через генератор cmake при запуске cmake. Если это не сработает, это означает, что стрелка еще не поддерживает его как конфигурацию cmake через conan, поэтому вам может потребоваться изменить поток сборки, чтобы иметь возможность запускать cmake вручную.

person Josh Weinstein    schedule 27.07.2021
comment
Спасибо. Казалось, что установка ARROW_RUNTIME_SIMD_LEVEL в качестве переменной среды или параметра строки conan должна помочь, но это не так. Мне нужно еще больше узнать о том, как Конан отправляет параметры в cmake. - person JACH; 27.07.2021