Vectorizedi Class — pytorch Architecture
Architecture documentation for the Vectorizedi class in vec512_int.h from the pytorch codebase.
Entity Profile
Source Code
aten/src/ATen/cpu/vec/vec512/vec512_int.h lines 44–197
template <>
class Vectorized<int64_t> : public Vectorizedi {
private:
static const Vectorized<int64_t> ones;
public:
using value_type = int64_t;
using size_type = int;
static constexpr size_type size() {
return 8;
}
using Vectorizedi::Vectorizedi;
Vectorized() {
values = _mm512_setzero_si512();
}
Vectorized(int64_t v) {
values = _mm512_set1_epi64(v);
}
Vectorized(
int64_t val1,
int64_t val2,
int64_t val3,
int64_t val4,
int64_t val5,
int64_t val6,
int64_t val7,
int64_t val8) {
values = _mm512_setr_epi64(val1, val2, val3, val4, val5, val6, val7, val8);
}
template <int64_t mask>
static Vectorized<int64_t> blend(
Vectorized<int64_t> a,
Vectorized<int64_t> b) {
return _mm512_mask_blend_epi64(mask, a.values, b.values);
}
static Vectorized<int64_t> blendv(
const Vectorized<int64_t>& a,
const Vectorized<int64_t>& b,
const Vectorized<int64_t>& mask) {
auto msb_one = _mm512_set1_epi64(0xFFFFFFFFFFFFFFFF);
auto mask_ = _mm512_cmp_epi64_mask(mask, msb_one, _MM_CMPINT_EQ);
return _mm512_mask_blend_epi64(mask_, a.values, b.values);
}
template <typename step_t>
static Vectorized<int64_t> arange(
int64_t base = 0,
step_t step = static_cast<step_t>(1)) {
return Vectorized<int64_t>(
base,
base + step,
base + 2 * step,
base + 3 * step,
base + 4 * step,
base + 5 * step,
base + 6 * step,
base + 7 * step);
}
static Vectorized<int64_t> set(
Vectorized<int64_t> a,
Vectorized<int64_t> b,
int64_t count = size()) {
switch (count) {
case 0:
return a;
case 1:
return blend<1>(a, b);
case 2:
return blend<3>(a, b);
case 3:
return blend<7>(a, b);
case 4:
return blend<15>(a, b);
case 5:
return blend<31>(a, b);
case 6:
return blend<63>(a, b);
case 7:
return blend<127>(a, b);
}
return b;
}
static Vectorized<int64_t> loadu(const void* ptr) {
return _mm512_loadu_si512(reinterpret_cast<const __m512i*>(ptr));
}
static Vectorized<int64_t> loadu(const void* ptr, int64_t count) {
if (count == size()) {
return _mm512_loadu_si512(reinterpret_cast<const __m512i*>(ptr));
} else {
__mmask8 mask = (1ULL << count) - 1;
auto ones = _mm512_set1_epi64(1);
return _mm512_mask_loadu_epi64(ones, mask, ptr);
}
}
void store(void* ptr, int count = size()) const {
if (count == size()) {
// ptr need not to be aligned here. See
// https://software.intel.com/content/www/us/en/develop/documentation/cpp-compiler-developer-guide-and-reference/top/compiler-reference/intrinsics/intrinsics-for-intel-advanced-vector-extensions/intrinsics-for-load-and-store-operations-1/mm512-storeu-si512.html
_mm512_storeu_si512(reinterpret_cast<__m512i*>(ptr), values);
} else if (count > 0) {
__mmask8 mask = (1ULL << count) - 1;
_mm512_mask_storeu_epi64(ptr, mask, values);
}
}
const int64_t& operator[](int idx) const = delete;
int64_t& operator[](int idx) = delete;
Vectorized<int64_t> abs() const {
auto is_larger_mask = _mm512_cmpgt_epi64_mask(zero_vector, values);
auto is_larger =
_mm512_mask_set1_epi64(zero_vector, is_larger_mask, 0xFFFFFFFFFFFFFFFF);
auto inverse = _mm512_xor_si512(values, is_larger);
return _mm512_sub_epi64(inverse, is_larger);
}
Vectorized<int64_t> real() const {
return *this;
}
Vectorized<int64_t> imag() const {
return _mm512_set1_epi64(0);
}
Vectorized<int64_t> conj() const {
return *this;
}
Vectorized<int64_t> neg() const;
Vectorized<int64_t> operator==(const Vectorized<int64_t>& other) const {
auto mask = _mm512_cmpeq_epi64_mask(values, other.values);
return _mm512_mask_set1_epi64(zero_vector, mask, 0xFFFFFFFFFFFFFFFF);
}
Vectorized<int64_t> operator!=(const Vectorized<int64_t>& other) const {
auto mask = _mm512_cmpneq_epi64_mask(values, other.values);
return _mm512_mask_set1_epi64(zero_vector, mask, 0xFFFFFFFFFFFFFFFF);
}
Vectorized<int64_t> operator<(const Vectorized<int64_t>& other) const {
auto mask = _mm512_cmplt_epi64_mask(values, other.values);
return _mm512_mask_set1_epi64(zero_vector, mask, 0xFFFFFFFFFFFFFFFF);
}
Vectorized<int64_t> operator<=(const Vectorized<int64_t>& other) const {
auto mask = _mm512_cmple_epi64_mask(values, other.values);
return _mm512_mask_set1_epi64(zero_vector, mask, 0xFFFFFFFFFFFFFFFF);
}
Vectorized<int64_t> operator>(const Vectorized<int64_t>& other) const {
auto mask = _mm512_cmpgt_epi64_mask(values, other.values);
return _mm512_mask_set1_epi64(zero_vector, mask, 0xFFFFFFFFFFFFFFFF);
}
Vectorized<int64_t> operator>=(const Vectorized<int64_t>& other) const {
auto mask = _mm512_cmpge_epi64_mask(values, other.values);
return _mm512_mask_set1_epi64(zero_vector, mask, 0xFFFFFFFFFFFFFFFF);
}
Vectorized<int64_t> eq(const Vectorized<int64_t>& other) const;
Vectorized<int64_t> ne(const Vectorized<int64_t>& other) const;
Vectorized<int64_t> gt(const Vectorized<int64_t>& other) const;
Vectorized<int64_t> ge(const Vectorized<int64_t>& other) const;
Vectorized<int64_t> lt(const Vectorized<int64_t>& other) const;
Vectorized<int64_t> le(const Vectorized<int64_t>& other) const;
};
Source
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free