Skip to content

Commit 4727b48

Browse files
committed
Update github workflow
1 parent 4446133 commit 4727b48

File tree

4 files changed

+123
-37
lines changed

4 files changed

+123
-37
lines changed

.github/scripts/conan-ci-setup.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ pip3 install conan
88

99
conan profile detect -f
1010

11-
std=20
11+
std=23
1212
profile="$(conan profile path default)"
1313

1414
mv "$profile" "${profile}.bak"

.github/workflows/ci.yml

+107-28
Original file line numberDiff line numberDiff line change
@@ -36,56 +36,66 @@ jobs:
3636
if: always()
3737
run: cmake -P cmake/spell.cmake
3838

39-
sanitize:
39+
test-avx512:
4040
needs: [lint]
4141

42-
runs-on: ubuntu-22.04
42+
strategy:
43+
matrix:
44+
os: [ubuntu-22.04]
4345

44-
env: { CXX: clang++-18 }
46+
runs-on: ${{ matrix.os }}
4547

4648
steps:
4749
- uses: actions/checkout@v4
4850

49-
- name: Install Python
50-
uses: actions/setup-python@v5
51-
with: { python-version: "3.12" }
52-
5351
- name: Install LLVM 18
5452
run: |
5553
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
5654
sudo apt-add-repository "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-18 main"
5755
sudo apt update
5856
sudo apt install llvm-18 llvm-18-dev llvm-18-tools clang-18 clang-tidy-18 clang-format-18 clang-tools-18 libclang-18-dev -y
5957
58+
- name: Install static analyzers
59+
if: matrix.os == 'ubuntu-22.04'
60+
run: >-
61+
sudo apt-get install clang-tidy-18 cppcheck -y -q
62+
63+
sudo update-alternatives --install
64+
/usr/bin/clang-tidy clang-tidy
65+
/usr/bin/clang-tidy-18 140
66+
6067
- name: Conan cache
6168
uses: actions/cache@v4
6269
with:
63-
path: conan_cache_save.tgz
64-
key: conan-sanitize-${{ hashFiles('conan*.[pl][yo]*') }}
70+
path: conan_cache_save-${{ matrix.os}}.tgz
71+
key: conan-${{ matrix.os }}-${{ hashFiles('conan*.[pl][yo]*') }}
6572

6673
- name: Install dependencies
74+
shell: bash
6775
run: bash < .github/scripts/conan-ci-setup.sh
6876

6977
- name: Configure
70-
run: cmake --preset=ci-sanitize
78+
shell: pwsh
79+
run: |
80+
$output = cmake -DENABLE_SIMD=ON "--preset=ci-$("${{ matrix.os }}".split("-")[0])"
81+
Write-Output $output
82+
if ($output -match "AVX-512 is supported") {
83+
Write-Output "AVX512 is enabled"
84+
} else {
85+
throw "AVX512 is not available"
86+
}
7187
7288
- name: Build
73-
run: cmake --build build/sanitize -j 2
89+
run: cmake --build build --config Release -j 4
90+
91+
- name: Install
92+
run: cmake --install build --config Release --prefix prefix
7493

7594
- name: Test
76-
working-directory: build/sanitize
77-
env:
78-
ASAN_OPTIONS: "strict_string_checks=1:\
79-
detect_stack_use_after_return=1:\
80-
check_initialization_order=1:\
81-
strict_init_order=1:\
82-
detect_leaks=1:\
83-
halt_on_error=1"
84-
UBSAN_OPTIONS: "print_stacktrace=1:\
85-
halt_on_error=1"
86-
run: ctest --output-on-failure --no-tests=error -j 2
87-
88-
test:
95+
working-directory: build
96+
run: ctest --output-on-failure --no-tests=error -C Release -j 2
97+
98+
test-nosimd:
8999
needs: [lint]
90100

91101
strategy:
@@ -113,14 +123,77 @@ jobs:
113123
/usr/bin/clang-tidy clang-tidy
114124
/usr/bin/clang-tidy-18 140
115125
126+
- name: Conan cache
127+
uses: actions/cache@v4
128+
with:
129+
path: conan_cache_save-${{ matrix.os}}.tgz
130+
key: conan-${{ matrix.os }}-${{ hashFiles('conan*.[pl][yo]*') }}
131+
132+
- name: Install dependencies
133+
shell: bash
134+
run: bash < .github/scripts/conan-ci-setup.sh
135+
136+
- name: Configure
137+
shell: pwsh
138+
run: |
139+
$output = cmake -DENABLE_SIMD=OFF "--preset=ci-$("${{ matrix.os }}".split("-")[0])"
140+
Write-Output $output
141+
if ($output -match "SIMD is not supported by the compiler") {
142+
Write-Output "SIMD is disabled"
143+
} else {
144+
throw "SIMD is enabled when it should not be"
145+
}
146+
147+
- name: Build
148+
run: cmake --build build --config Release -j 4
149+
150+
- name: Install
151+
run: cmake --install build --config Release --prefix prefix
152+
153+
- name: Test
154+
working-directory: build
155+
run: ctest --output-on-failure --no-tests=error -C Release -j 2
156+
157+
test-neon:
158+
needs: [lint]
159+
160+
strategy:
161+
matrix:
162+
os: [macos-14]
163+
164+
runs-on: ${{ matrix.os }}
165+
166+
env:
167+
CC: /opt/homebrew/opt/llvm@18/bin/clang
168+
CXX: /opt/homebrew/opt/llvm@18/bin/clang++
169+
CLANG_DIR: '/opt/homebrew/opt/llvm@18/bin/clang'
170+
LLVM_DIR: '/opt/homebrew/opt/llvm@18'
171+
172+
steps:
173+
- uses: actions/checkout@v4
174+
175+
- name: Install LLVM 18
176+
run: |
177+
brew install llvm@18
178+
179+
- name: Verify Installation
180+
run: |
181+
${{ env.CC }} --version
182+
${{ env.CXX }} --version
183+
184+
- name: Install static analyzers
185+
if: matrix.os == 'macos-14'
186+
run: >-
187+
brew install cppcheck
188+
116189
- name: Install Python
117190
uses: actions/setup-python@v5
118191
with: { python-version: "3.12" }
119192

120193
- name: Conan cache
121194
uses: actions/cache@v4
122195
with:
123-
path: conan_cache_save.tgz
196+
path: conan_cache_save-${{ matrix.os}}.tgz
124197
key: conan-${{ matrix.os }}-${{ hashFiles('conan*.[pl][yo]*') }}
125198

126199
- name: Install dependencies
@@ -129,15 +202,21 @@ jobs:
129202

130203
- name: Configure
131204
shell: pwsh
132-
run: cmake "--preset=ci-$("${{ matrix.os }}".split("-")[0])"
205+
run: |
206+
$output = cmake -DENABLE_SIMD=OFF "--preset=ci-$("${{ matrix.os }}".split("-")[0])"
207+
Write-Output $output
208+
if ($output -match "ARM NEON is supported by the compiler") {
209+
Write-Output "ARM NEON is enabled"
210+
} else {
211+
throw "ARM NEON is not available"
212+
}
133213
134214
- name: Build
135-
run: cmake --build build --config Release -j 2
215+
run: cmake --build build --config Release -j 4
136216

137217
- name: Install
138218
run: cmake --install build --config Release --prefix prefix
139219

140220
- name: Test
141221
working-directory: build
142222
run: ctest --output-on-failure --no-tests=error -C Release -j 2
143-

CMakeLists.txt

+13-6
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ project(
1313
include(cmake/project-is-top-level.cmake)
1414
include(cmake/variables.cmake)
1515

16-
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON)
16+
# set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON)
1717
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
18-
# add_compile_options(-fno-inline -fno-omit-frame-pointer)
18+
add_compile_options(-fno-inline -fno-omit-frame-pointer)
1919

2020

2121
# ---- Declare library ----
@@ -30,24 +30,31 @@ add_library(
3030
source/units/coordinates.cpp
3131
)
3232

33+
option(ENABLE_SIMD "Enable SIMD instructions if available" ON)
34+
3335
include(CheckCXXCompilerFlag)
34-
check_cxx_compiler_flag("-mavx512f -mavx512dq -mavx512vl -mavx512bf16" HAS_AVX512)
36+
check_cxx_source_compiles("
37+
#include <immintrin.h>
38+
int main() {
39+
__m512i t = _mm512_set1_epi64(0);
40+
return 0;
41+
}" HAS_AVX512)
3542
check_cxx_source_compiles("
3643
#include <arm_neon.h>
3744
int main() {
3845
float32x4_t vec = vdupq_n_f32(0.0f);
3946
return 0;
4047
}" HAS_NEON)
4148

42-
if (HAS_ALL_AVX512)
49+
if (HAS_AVX512 AND ENABLE_SIMD)
4350
message(STATUS "AVX-512 is supported by the compiler.")
4451
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx512f -mavx512dq -mavx512vl -mavx512bf16")
4552
target_sources(fractal-generator_lib PRIVATE source/mandelbrot/equations_simd.cpp)
46-
elseif(HAS_NEON)
53+
elseif(HAS_NEON AND ENABLE_SIMD)
4754
message(STATUS "ARM NEON is supported by the compiler.")
4855
target_sources(fractal-generator_lib PRIVATE source/mandelbrot/equations_neon.cpp)
4956
else()
50-
message(STATUS "SIMD is not fully supported by the compiler. SIMD will not be enabled.")
57+
message(STATUS "SIMD is not supported by the compiler. SIMD will not be enabled.")
5158
target_sources(fractal-generator_lib PRIVATE source/mandelbrot/equations_compat.cpp)
5259
endif()
5360

source/config.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ constexpr std::size_t WINDOW_HEIGHT = 600UZ * 2;
1212
constexpr std::size_t FRAME_RATE = 60UZ;
1313

1414
constexpr complex_domain START_COMPLEX_DOMAIN{
15-
complex_coordinate{-2, -1},
16-
complex_coordinate{1, 1.25 }
15+
complex_coordinate{-2, -1 },
16+
complex_coordinate{1, 1.25}
1717
};
1818

1919
const complex_underlying MANDELBROT_DIVERGENCE_NORM = 4;

0 commit comments

Comments
 (0)