Skip to content

Commit 50d205d

Browse files
[x86_64] Minimal support for avx512vl
avx512vl just extends 128 and 256 bits register with some operations, it does not have any 512 bit instructions, so the description is mostly empty and preliminary work for #1345
1 parent 8b81687 commit 50d205d

10 files changed

Lines changed: 99 additions & 4 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ The following SIMD instruction set extensions are supported:
5050
Architecture | Instruction set extensions
5151
-------------|-----------------------------------------------------
5252
x86 | SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, FMA3+SSE, FMA3+AVX, FMA3+AVX2
53-
x86 | AVX512BW, AVX512CD, AVX512DQ, AVX512F (gcc7 and higher)
53+
x86 | AVX512BW, AVX512CD, AVX512DQ, AVX512F, AVX512VL (gcc7 and higher)
5454
x86 AMD | FMA4
5555
ARM | NEON, NEON64, SVE128/256/512 (fixed vector size)
5656
WebAssembly | WASM

docs/Doxyfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ INPUT = ../include/xsimd/types/xsimd_api.hpp \
1515
../include/xsimd/types/xsimd_avx512cd_register.hpp \
1616
../include/xsimd/types/xsimd_avx512dq_register.hpp \
1717
../include/xsimd/types/xsimd_avx512f_register.hpp \
18+
../include/xsimd/types/xsimd_avx512vl_register.hpp \
1819
../include/xsimd/types/xsimd_avx_register.hpp \
1920
../include/xsimd/types/xsimd_fma3_avx_register.hpp \
2021
../include/xsimd/types/xsimd_fma3_avx2_register.hpp \
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/***************************************************************************
2+
* Copyright (c) Johan Mabille, Sylvain Corlay, Wolf Vollprecht and *
3+
* Martin Renou *
4+
* Copyright (c) QuantStack *
5+
* Copyright (c) Serge Guelton *
6+
* *
7+
* Distributed under the terms of the BSD 3-Clause License. *
8+
* *
9+
* The full license is in the file LICENSE, distributed with this software. *
10+
****************************************************************************/
11+
12+
#ifndef XSIMD_AVX512VL_HPP
13+
#define XSIMD_AVX512VL_HPP
14+
15+
#include "../types/xsimd_avx512vl_register.hpp"
16+
17+
// no 512-bit operation with avx512-vl, it only provides 128 et 256 bits ones.
18+
19+
#endif

include/xsimd/arch/xsimd_isa.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@
7373
#include "./xsimd_avx512f.hpp"
7474
#endif
7575

76+
#if XSIMD_WITH_AVX512VL
77+
#include "./xsimd_avx512vl.hpp"
78+
#endif
79+
7680
#if XSIMD_WITH_AVX512DQ
7781
#include "./xsimd_avx512dq.hpp"
7882
#endif
@@ -89,6 +93,10 @@
8993
#include "./xsimd_avx512pf.hpp"
9094
#endif
9195

96+
#if XSIMD_WITH_AVX512VL
97+
#include "./xsimd_avx512pf.hpp"
98+
#endif
99+
92100
#if XSIMD_WITH_AVX512IFMA
93101
#include "./xsimd_avx512ifma.hpp"
94102
#endif

include/xsimd/config/xsimd_arch.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ namespace xsimd
162162
} // namespace detail
163163

164164
using all_x86_architectures = arch_list<
165-
avx512vnni<avx512vbmi2>, avx512vbmi2, avx512vbmi, avx512ifma, avx512pf, avx512vnni<avx512bw>, avx512bw, avx512er, avx512dq, avx512cd, avx512f,
165+
avx512vnni<avx512vbmi2>, avx512vbmi2, avx512vbmi, avx512ifma, avx512pf, avx512vnni<avx512bw>, avx512bw, avx512er, avx512dq, avx512vl, avx512cd, avx512f,
166166
avxvnni, fma3<avx2>, avx2, fma3<avx>, avx, avx2_128, avx_128, fma4, fma3<sse4_2>,
167167
sse4_2, sse4_1, /*sse4a,*/ ssse3, sse3, sse2>;
168168

include/xsimd/config/xsimd_config.hpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,17 @@
307307
#define XSIMD_WITH_AVX512CD 0
308308
#endif
309309

310+
/**
311+
* @ingroup xsimd_config_macro
312+
*
313+
* Set to 1 if AVX512VL is available at compile-time, to 0 otherwise.
314+
*/
315+
#ifdef __AVX512VL__
316+
#define XSIMD_WITH_AVX512VL XSIMD_WITH_AVX512CD
317+
#else
318+
#define XSIMD_WITH_AVX512VL 0
319+
#endif
320+
310321
/**
311322
* @ingroup xsimd_config_macro
312323
*
@@ -615,7 +626,7 @@
615626

616627
#endif
617628

618-
#if !XSIMD_WITH_SSE2 && !XSIMD_WITH_SSE3 && !XSIMD_WITH_SSSE3 && !XSIMD_WITH_SSE4_1 && !XSIMD_WITH_SSE4_2 && !XSIMD_WITH_AVX && !XSIMD_WITH_AVX2 && !XSIMD_WITH_AVXVNNI && !XSIMD_WITH_FMA3_SSE && !XSIMD_WITH_FMA4 && !XSIMD_WITH_FMA3_AVX && !XSIMD_WITH_FMA3_AVX2 && !XSIMD_WITH_AVX512F && !XSIMD_WITH_AVX512CD && !XSIMD_WITH_AVX512DQ && !XSIMD_WITH_AVX512BW && !XSIMD_WITH_AVX512ER && !XSIMD_WITH_AVX512PF && !XSIMD_WITH_AVX512IFMA && !XSIMD_WITH_AVX512VBMI && !XSIMD_WITH_AVX512VBMI2 && !XSIMD_WITH_NEON && !XSIMD_WITH_NEON64 && !XSIMD_WITH_SVE && !XSIMD_WITH_RVV && !XSIMD_WITH_WASM && !XSIMD_WITH_VSX && !XSIMD_WITH_EMULATED && !XSIMD_WITH_VXE
629+
#if !XSIMD_WITH_SSE2 && !XSIMD_WITH_SSE3 && !XSIMD_WITH_SSSE3 && !XSIMD_WITH_SSE4_1 && !XSIMD_WITH_SSE4_2 && !XSIMD_WITH_AVX && !XSIMD_WITH_AVX2 && !XSIMD_WITH_AVXVNNI && !XSIMD_WITH_FMA3_SSE && !XSIMD_WITH_FMA4 && !XSIMD_WITH_FMA3_AVX && !XSIMD_WITH_FMA3_AVX2 && !XSIMD_WITH_AVX512F && !XSIMD_WITH_AVX512CD && !XSIMD_WITH_AVX512VL && !XSIMD_WITH_AVX512DQ && !XSIMD_WITH_AVX512BW && !XSIMD_WITH_AVX512ER && !XSIMD_WITH_AVX512PF && !XSIMD_WITH_AVX512IFMA && !XSIMD_WITH_AVX512VBMI && !XSIMD_WITH_AVX512VBMI2 && !XSIMD_WITH_NEON && !XSIMD_WITH_NEON64 && !XSIMD_WITH_SVE && !XSIMD_WITH_RVV && !XSIMD_WITH_WASM && !XSIMD_WITH_VSX && !XSIMD_WITH_EMULATED && !XSIMD_WITH_VXE
619630
#define XSIMD_NO_SUPPORTED_ARCHITECTURE
620631
#endif
621632

include/xsimd/config/xsimd_cpuid.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ namespace xsimd
4949
ARCH_FIELD_EX(fma3<::xsimd::avx2>, fma3_avx2)
5050
ARCH_FIELD(avx512f)
5151
ARCH_FIELD(avx512cd)
52+
ARCH_FIELD(avx512vl)
5253
ARCH_FIELD(avx512dq)
5354
ARCH_FIELD(avx512bw)
5455
ARCH_FIELD(avx512er)
@@ -121,6 +122,7 @@ namespace xsimd
121122

122123
avx512f = cpu.avx512f();
123124
avx512cd = cpu.avx512cd();
125+
avx512vl = cpu.avx512vl();
124126
avx512dq = cpu.avx512dq();
125127
avx512bw = cpu.avx512bw();
126128
avx512er = cpu.avx512er();

include/xsimd/types/xsimd_all_registers.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "./xsimd_avx512pf_register.hpp"
2020
#include "./xsimd_avx512vbmi2_register.hpp"
2121
#include "./xsimd_avx512vbmi_register.hpp"
22+
#include "./xsimd_avx512vl_register.hpp"
2223
#include "./xsimd_avx512vnni_avx512bw_register.hpp"
2324
#include "./xsimd_avx512vnni_avx512vbmi2_register.hpp"
2425
#include "./xsimd_avx_register.hpp"
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/***************************************************************************
2+
* Copyright (c) Johan Mabille, Sylvain Corlay, Wolf Vollprecht and *
3+
* Martin Renou *
4+
* Copyright (c) QuantStack *
5+
* Copyright (c) Serge Guelton *
6+
* *
7+
* Distributed under the terms of the BSD 3-Clause License. *
8+
* *
9+
* The full license is in the file LICENSE, distributed with this software. *
10+
****************************************************************************/
11+
12+
#ifndef XSIMD_AVX512VL_REGISTER_HPP
13+
#define XSIMD_AVX512VL_REGISTER_HPP
14+
15+
#include "./xsimd_avx512cd_register.hpp"
16+
17+
namespace xsimd
18+
{
19+
20+
/**
21+
* @ingroup architectures
22+
*
23+
* AVX512DQ instructions
24+
*/
25+
struct avx512vl : avx512cd
26+
{
27+
static constexpr bool supported() noexcept { return XSIMD_WITH_AVX512VL; }
28+
static constexpr bool available() noexcept { return true; }
29+
static constexpr char const* name() noexcept { return "avx512vl"; }
30+
};
31+
32+
#if XSIMD_WITH_AVX512VL
33+
34+
#if !XSIMD_WITH_AVX512CD
35+
#error "architecture inconsistency: avx512vl requires avx512cd"
36+
#endif
37+
38+
namespace types
39+
{
40+
template <class T>
41+
struct get_bool_simd_register<T, avx512vl>
42+
{
43+
using type = simd_avx512_bool_register<T>;
44+
};
45+
46+
XSIMD_DECLARE_SIMD_REGISTER_ALIAS(avx512vl, avx512cd);
47+
48+
}
49+
#endif
50+
}
51+
#endif

test/test_cpu_features.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ TEST_CASE("[cpu_features] x86 implication chains")
6666
CHECK_IMPLICATION(cpu.fma4(), cpu.avx());
6767
CHECK_IMPLICATION(cpu.fma3(), cpu.avx());
6868

69-
// AVX-512 iplication chain
69+
// AVX-512 implication chain
7070
CHECK_IMPLICATION(cpu.avx512f(), cpu.avx2());
71+
CHECK_IMPLICATION(cpu.avx512vl(), cpu.avx512cd());
7172
CHECK_IMPLICATION(cpu.avx512dq(), cpu.avx512f());
7273
CHECK_IMPLICATION(cpu.avx512ifma(), cpu.avx512f());
7374
CHECK_IMPLICATION(cpu.avx512pf(), cpu.avx512f());
@@ -132,6 +133,7 @@ TEST_CASE("[cpu_features] x86 features from environment")
132133
CHECK_ENV_FEATURE("XSIMD_TEST_CPU_ASSUME_AVX512F", cpu.avx512f());
133134
CHECK_ENV_FEATURE("XSIMD_TEST_CPU_ASSUME_AVX512BW", cpu.avx512bw());
134135
CHECK_ENV_FEATURE("XSIMD_TEST_CPU_ASSUME_AVX512CD", cpu.avx512cd());
136+
CHECK_ENV_FEATURE("XSIMD_TEST_CPU_ASSUME_AVX512VL", cpu.avx512vl());
135137
CHECK_ENV_FEATURE("XSIMD_TEST_CPU_ASSUME_AVX512DQ", cpu.avx512dq());
136138
CHECK_ENV_FEATURE("XSIMD_TEST_CPU_ASSUME_AVXVNNI", cpu.avxvnni());
137139
}

0 commit comments

Comments
 (0)