问题描述
我正在使用 conan 构建一个使用箭头镶木地板的库。我自己制作了箭头,因为我在柯南中心找不到包含镶木地板的版本:
在我的 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 和 this 帖子来看,似乎存在架构冲突。确实存在差异:
詹金斯服务器
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 的支持,我如何告诉柯南在没有 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_LEVEL
和 ARROW_RUNTIME_SIMD_LEVEL
。如果这不起作用,则意味着箭头尚不支持通过 conan 将其作为 cmake 配置,因此您可能需要更改构建流程才能手动运行 cmake