From dc7f41c7db26334a554f528ad3a89def063b65c2 Mon Sep 17 00:00:00 2001 From: Enrico Seiler Date: Tue, 30 Jan 2024 13:22:20 +0100 Subject: [PATCH] [INFRA] Add IntelLLVM CI (#3225) * [INFRA] Add IntelLLVM CI * [FIX] optimization error * [INFRA] Also run snippet + performance for IntelLLVM --- .github/workflows/ci_linux.yml | 7 +++++++ .github/workflows/ci_misc.yml | 15 ++++++++++++++ include/seqan3/io/detail/magic_header.hpp | 20 ++++++++++--------- ...al_affine_alignment_parallel_benchmark.cpp | 6 +++--- test/seqan3-test.cmake | 4 +++- 5 files changed, 39 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci_linux.yml b/.github/workflows/ci_linux.yml index 4d13bde76d..8ae470ad01 100644 --- a/.github/workflows/ci_linux.yml +++ b/.github/workflows/ci_linux.yml @@ -62,6 +62,12 @@ jobs: build: unit build_type: Release + - name: "IntelLLVM" + compiler: "intel" + build: unit + build_type: Release + cxx_flags: "-fp-model=strict" + steps: - name: Checkout SeqAn3 uses: actions/checkout@v4 @@ -84,6 +90,7 @@ jobs: ccache_size: 75M - name: Install CMake + if: contains(matrix.compiler, 'intel') == false uses: seqan/actions/setup-cmake@main with: cmake: 3.16.9 diff --git a/.github/workflows/ci_misc.yml b/.github/workflows/ci_misc.yml index f28871cb07..99b6ee632b 100644 --- a/.github/workflows/ci_misc.yml +++ b/.github/workflows/ci_misc.yml @@ -48,6 +48,13 @@ jobs: build_type: Release test_threads: 1 # snippets create and delete files and some separate tests create/delete the same files + - name: "Snippet IntelLLVM" + compiler: "intel" + build: snippet + build_type: Release + test_threads: 1 # snippets create and delete files and some separate tests create/delete the same files + cxx_flags: "-fp-model=strict" + - name: "Performance clang17 libc++" compiler: "clang-17" build: performance @@ -61,6 +68,13 @@ jobs: build_type: Release test_threads: 2 + - name: "Performance IntelLLVM" + compiler: "intel" + build: performance + build_type: Release + test_threads: 2 + cxx_flags: "-fp-model=strict" + - name: "Header clang17 libc++" compiler: "clang-17" build: header @@ -96,6 +110,7 @@ jobs: fetch-depth: 1 - name: Install CMake + if: contains(matrix.compiler, 'intel') == false uses: seqan/actions/setup-cmake@main with: cmake: 3.16.9 diff --git a/include/seqan3/io/detail/magic_header.hpp b/include/seqan3/io/detail/magic_header.hpp index b32b64f84e..27cd46eb59 100644 --- a/include/seqan3/io/detail/magic_header.hpp +++ b/include/seqan3/io/detail/magic_header.hpp @@ -10,6 +10,7 @@ #pragma once #include +#include #include #include #include @@ -17,7 +18,6 @@ #include #include -#include #include namespace seqan3::detail @@ -97,14 +97,16 @@ struct bgzf_compression static_assert(std::equality_comparable_with, "The given char type of the span must be comparable with char."); - return (header[0] == magic_header[0] && // GZ_ID1 - header[1] == magic_header[1] && // GZ_ID2 - header[2] == magic_header[2] && // GZ_CM - (header[3] & magic_header[3]) != 0 && // FLG_FEXTRA - to_little_endian(*reinterpret_cast(&header[10])) == magic_header[10] && // BGZF_ID1 - header[12] == magic_header[12] && // BGZF_ID2 - header[13] == magic_header[13] && // BGZF_SLEN - to_little_endian(*reinterpret_cast(&header[14])) == magic_header[14]); // BGZF_XLEN + static constexpr auto id1_pos = std::endian::native == std::endian::little ? 10 : 11; + + return (header[0] == magic_header[0] && // GZ_ID1 + header[1] == magic_header[1] && // GZ_ID2 + header[2] == magic_header[2] && // GZ_CM + (header[3] & magic_header[3]) != 0 && // FLG_FEXTRA + header[id1_pos] == magic_header[10] && // BGZF_ID1 + header[12] == magic_header[12] && // BGZF_ID2 + header[13] == magic_header[13] && // BGZF_SLEN + header[id1_pos + 4] == magic_header[14]); // BGZF_XLEN } }; diff --git a/test/performance/alignment/global_affine_alignment_parallel_benchmark.cpp b/test/performance/alignment/global_affine_alignment_parallel_benchmark.cpp index 97835b9096..fee03de502 100644 --- a/test/performance/alignment/global_affine_alignment_parallel_benchmark.cpp +++ b/test/performance/alignment/global_affine_alignment_parallel_benchmark.cpp @@ -157,8 +157,8 @@ void seqan2_affine_dna4_parallel(benchmark::State & state) BENCHMARK_TEMPLATE(seqan2_affine_dna4_parallel, score)->UseRealTime(); #endif // SEQAN3_HAS_SEQAN2 -// Crashes with libc++ -#if defined(SEQAN3_HAS_SEQAN2) && defined(_OPENMP) && !defined(_LIBCPP_VERSION) +// Crashes with libc++ or IntelLLVM +#if defined(SEQAN3_HAS_SEQAN2) && defined(_OPENMP) && !defined(_LIBCPP_VERSION) && !defined(__INTEL_LLVM_COMPILER) template void seqan2_affine_dna4_omp_for(benchmark::State & state) { @@ -199,7 +199,7 @@ void seqan2_affine_dna4_omp_for(benchmark::State & state) BENCHMARK_TEMPLATE(seqan2_affine_dna4_omp_for, score)->UseRealTime(); BENCHMARK_TEMPLATE(seqan2_affine_dna4_omp_for, trace)->UseRealTime(); -#endif // defined(SEQAN3_HAS_SEQAN2) && defined(_OPENMP) && !defined(_LIBCPP_VERSION) +#endif // defined(SEQAN3_HAS_SEQAN2) && defined(_OPENMP) && !defined(_LIBCPP_VERSION) && !defined(__INTEL_LLVM_COMPILER) // ============================================================================ // instantiate tests diff --git a/test/seqan3-test.cmake b/test/seqan3-test.cmake index d56035daef..5e665e98c0 100644 --- a/test/seqan3-test.cmake +++ b/test/seqan3-test.cmake @@ -11,6 +11,7 @@ cmake_minimum_required (VERSION 3.10) # require SeqAn3 package find_package (SeqAn3 REQUIRED HINTS ${CMAKE_CURRENT_LIST_DIR}/../build_system) +include (CheckCXXCompilerFlag) include (CheckCXXSourceCompiles) include (FindPackageHandleStandardArgs) include (FindPackageMessage) @@ -80,7 +81,8 @@ if (NOT TARGET seqan3::test::performance) # std::views::join is experimental in libc++ target_compile_definitions (seqan3_test_performance INTERFACE _LIBCPP_ENABLE_EXPERIMENTAL) - if (SEQAN3_BENCHMARK_ALIGN_LOOPS) + check_cxx_compiler_flag ("-falign-loops=32" SEQAN3_HAS_FALIGN_LOOPS) + if (SEQAN3_BENCHMARK_ALIGN_LOOPS AND SEQAN3_HAS_FALIGN_LOOPS) target_compile_options (seqan3_test_performance INTERFACE "-falign-loops=32") endif ()