Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 28 additions & 8 deletions cmake/x86_64InstructionFlags.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,35 @@ CHECK_CXX_COMPILER_FLAG(-msse4.1 CXX_SSE4)
CHECK_CXX_COMPILER_FLAG(-msse3 CXX_SSE3)
CHECK_CXX_COMPILER_FLAG(-msse CXX_SSE)

# Turn off AVX512BF16 on Ubuntu 18.04 as it is not supported by its binutils assembler version.
# Check binutils version for AVX512 instruction support.
# Even if the compiler supports certain flags, the assembler (binutils) may not.
# - AVX512-BF16 requires binutils >= 2.34
# - AVX512-FP16 requires binutils >= 2.38
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
execute_process(COMMAND lsb_release -rs
OUTPUT_VARIABLE UBUNTU_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE)

if("${UBUNTU_VERSION}" STREQUAL "18.04")
message(STATUS "Compiling on Ubuntu 18.04, turning off CXX_AVX512BF16 flag.")
set(CXX_AVX512BF16 FALSE)
# Get binutils/assembler version
execute_process(COMMAND as --version
OUTPUT_VARIABLE AS_VERSION_OUTPUT
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET)
# Extract version number (e.g., "2.34" from "GNU assembler (GNU Binutils for Ubuntu) 2.34")
string(REGEX MATCH "[0-9]+\\.[0-9]+" BINUTILS_VERSION "${AS_VERSION_OUTPUT}")

if(BINUTILS_VERSION)
message(STATUS "Detected binutils version: ${BINUTILS_VERSION}")

# AVX512-BF16 requires binutils >= 2.34
if(BINUTILS_VERSION VERSION_LESS "2.34")
message(STATUS "binutils ${BINUTILS_VERSION} < 2.34, turning off CXX_AVX512BF16 flag.")
set(CXX_AVX512BF16 FALSE)
endif()

# AVX512-FP16 requires binutils >= 2.38
if(BINUTILS_VERSION VERSION_LESS "2.38")
message(STATUS "binutils ${BINUTILS_VERSION} < 2.38, turning off CXX_AVX512FP16 flag.")
set(CXX_AVX512FP16 FALSE)
endif()
else()
message(WARNING "Could not detect binutils version, AVX512 features may fail to assemble")
endif()
endif()

Expand Down
4 changes: 2 additions & 2 deletions src/VecSim/spaces/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wall")

set(OPTIMIZATIONS "")

if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64|amd64)|(^i.86$)")
if(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64|amd64)|(^i.86$)")
# Check that the compiler supports instructions flag.
# from gcc14+ -mavx512bw is implicitly enabled when -mavx512vbmi2 is requested
include(${root}/cmake/x86_64InstructionFlags.cmake)
Expand Down Expand Up @@ -93,7 +93,7 @@ if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64|amd64)|(^i.86$)")
endif()
endif()

if (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "(aarch64)|(arm64)|(ARM64)|(armv.*)")
if (CMAKE_SYSTEM_PROCESSOR MATCHES "(aarch64)|(arm64)|(ARM64)|(armv.*)")
include(${root}/cmake/aarch64InstructionFlags.cmake)

# Create different optimization implementations for ARM architecture
Expand Down
4 changes: 2 additions & 2 deletions tests/benchmark/spaces_benchmarks/bm_spaces_int8.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ INITIALIZE_BENCHMARKS_SET_Cosine(BM_VecSimSpaces_Integers_INT8, INT8, SVE2, 32,
#endif
#ifdef OPT_SVE
bool sve_supported = opt.sve; // Check for SVE support
INITIALIZE_BENCHMARKS_SET_L2_IP(BM_VecSimSpaces_Integers_INT8, INT8, SVE, 32, sve2_supported);
INITIALIZE_BENCHMARKS_SET_Cosine(BM_VecSimSpaces_Integers_INT8, INT8, SVE, 32, sve2_supported);
INITIALIZE_BENCHMARKS_SET_L2_IP(BM_VecSimSpaces_Integers_INT8, INT8, SVE, 32, sve_supported);
INITIALIZE_BENCHMARKS_SET_Cosine(BM_VecSimSpaces_Integers_INT8, INT8, SVE, 32, sve_supported);
#endif
#ifdef OPT_NEON_DOTPROD
bool neon_dotprod_supported = opt.asimddp;
Expand Down
4 changes: 2 additions & 2 deletions tests/benchmark/spaces_benchmarks/bm_spaces_uint8.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ INITIALIZE_BENCHMARKS_SET_Cosine(BM_VecSimSpaces_Integers_UINT8, UINT8, SVE2, 32
#endif
#ifdef OPT_SVE
bool sve_supported = opt.sve; // Check for SVE support
INITIALIZE_BENCHMARKS_SET_L2_IP(BM_VecSimSpaces_Integers_UINT8, UINT8, SVE, 32, sve2_supported);
INITIALIZE_BENCHMARKS_SET_Cosine(BM_VecSimSpaces_Integers_UINT8, UINT8, SVE, 32, sve2_supported);
INITIALIZE_BENCHMARKS_SET_L2_IP(BM_VecSimSpaces_Integers_UINT8, UINT8, SVE, 32, sve_supported);
INITIALIZE_BENCHMARKS_SET_Cosine(BM_VecSimSpaces_Integers_UINT8, UINT8, SVE, 32, sve_supported);
#endif
#ifdef OPT_NEON_DOTPROD
// NEON_DOTPROD functions
Expand Down
Loading