arity Class — pytorch Architecture
Architecture documentation for the arity class in Loops.h from the pytorch codebase.
Entity Profile
Source Code
aten/src/ATen/native/cpu/Loops.h lines 251–296
template <typename op_t, typename vop_t>
struct VectorizedLoop2d {
op_t op;
vop_t vop;
using traits = function_traits<op_t>;
static constexpr int ntensors = traits::arity + 1;
using data_t = std::array<char*, ntensors>;
VectorizedLoop2d(op_t op, vop_t vop):
op(std::move(op)), vop(std::move(vop)) {}
static void advance(data_t &data, const int64_t *outer_strides) {
for (const auto arg : c10::irange(data.size())) {
data[arg] += outer_strides[arg];
}
}
void operator()(char** base, const int64_t *strides, int64_t size0, int64_t size1) {
data_t data;
std::copy_n(base, ntensors, data.data());
const int64_t *outer_strides = &strides[ntensors];
if (is_contiguous<traits>(strides)) {
for ([[maybe_unused]] const auto i : c10::irange(size1)) {
vectorized_loop(data.data(), size0, 0, op, vop);
advance(data, outer_strides);
}
} else {
using Indices = std::make_index_sequence<traits::arity>;
unroll_contiguous_scalar_checks<traits>(strides, Indices{}, [&](size_t idx) {
if (idx) {
for ([[maybe_unused]] const auto i : c10::irange(size1)) {
vectorized_loop(data.data(), size0, idx, op, vop);
advance(data, outer_strides);
}
} else {
for ([[maybe_unused]] const auto i : c10::irange(size1)) {
basic_loop(data.data(), strides, 0, size0, op);
advance(data, outer_strides);
}
}
});
}
}
};
Source
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free