箭头镶木地板的非法指令信号。如何在没有 AVX2 的情况下使用 Conan 进行构建

Illegal instruction signal for arrow parquet. How to build with Conan without AVX2

我正在使用 conan 构建一个使用 arrow parquet 的库。我自己建造了箭头,因为我在柯南中心找不到包含镶木地板的版本:

在我的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

this and this 的帖子来看,似乎可能存在架构冲突。事实上,还是有区别的:

詹金斯服务器

AVX supported
AVX2 not supported

我的电脑

AVX supported
AVX2 supported

此外,arrow 代码优化达到了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 的支持,我如何告诉柯南在没有 AVX2 支持的情况下构建箭头,或者最低通用配置可能是什么?

或者我应该看一些完全不同的东西?

在箭头中,使用的 SIMD 指令的级别由这些 cmake options

控制
  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")

此选项用于here,检查是否传入预处理器定义

  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 时通过 cmake 生成器指定此 cmake 选项,ARROW_SIMD_LEVELARROW_RUNTIME_SIMD_LEVEL。如果这不起作用,则意味着箭头还不支持通过柯南将其作为 cmake 配置,因此您可能需要更改构建流程才能手动 运行 cmake