File size: 1,813 Bytes
d1d4335 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include "./Utils.h"
#include <asmjit/asmjit.h>
namespace fbgemm {
/**
* @brief Some commonly used variables for different instruction sets
*/
template <inst_set_t inst_set>
struct simd_info;
template <>
struct simd_info<inst_set_t::avx2> {
static constexpr int WIDTH_BITS = 256;
static constexpr int WIDTH_BYTES = 32;
static constexpr int WIDTH_32BIT_ELEMS = 8;
static constexpr int NUM_VEC_REGS = 16;
using vec_reg_t = asmjit::x86::Ymm;
};
template <>
struct simd_info<inst_set_t::sve> {
// Implementation is unrolled to match params used on avx2
static constexpr int WIDTH_BITS = 256;
static constexpr int WIDTH_BYTES = 32;
static constexpr int WIDTH_32BIT_ELEMS = 8;
static constexpr int NUM_VEC_REGS = 32;
};
template <>
struct simd_info<inst_set_t::avx512> {
static constexpr int WIDTH_BITS = 512;
static constexpr int WIDTH_BYTES = 64;
static constexpr int WIDTH_32BIT_ELEMS = 16;
static constexpr int NUM_VEC_REGS = 32;
using vec_reg_t = asmjit::x86::Zmm;
};
template <>
struct simd_info<inst_set_t::avx512_vnni>
: public simd_info<inst_set_t::avx512> {};
template <>
struct simd_info<inst_set_t::avx512_ymm> {
static constexpr int WIDTH_BITS = 256;
static constexpr int WIDTH_BYTES = 32;
static constexpr int WIDTH_32BIT_ELEMS = 8;
static constexpr int NUM_VEC_REGS = 32;
using vec_reg_t = asmjit::x86::Ymm;
};
template <>
struct simd_info<inst_set_t::avx512_vnni_ymm>
: public simd_info<inst_set_t::avx512_ymm> {};
} // namespace fbgemm
|