箭头镶木地板的非法指令信号。如何在没有 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_LEVEL
和 ARROW_RUNTIME_SIMD_LEVEL
。如果这不起作用,则意味着箭头还不支持通过柯南将其作为 cmake 配置,因此您可能需要更改构建流程才能手动 运行 cmake
我正在使用 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_LEVEL
和 ARROW_RUNTIME_SIMD_LEVEL
。如果这不起作用,则意味着箭头还不支持通过柯南将其作为 cmake 配置,因此您可能需要更改构建流程才能手动 运行 cmake