log_softmax Class — pytorch Architecture
Architecture documentation for the log_softmax class in SoftMaxKernel.cpp from the pytorch codebase.
Entity Profile
Source Code
aten/src/ATen/native/cpu/SoftMaxKernel.cpp lines 161–204
template <typename scalar_t, bool log_softmax>
inline void _vec_host_softmax_backward_lastdim(
scalar_t* grad_input_data_base,
const scalar_t* grad_data_base,
const scalar_t* output_data_base,
int64_t outer_size,
int64_t dim_size) {
using Vec = vec::Vectorized<at::opmath_type<scalar_t>>;
// See Note: grain_size value of 0
parallel_for(
0,
outer_size,
0,
[&](int64_t begin, int64_t end) {
for (const auto i : c10::irange(begin, end)) {
scalar_t* grad_input_data = grad_input_data_base + i * dim_size;
const scalar_t* grad_data = grad_data_base + i * dim_size;
const scalar_t* output_data = output_data_base + i * dim_size;
if constexpr (log_softmax) {
auto sum = vec::reduce_all<scalar_t>(
[](Vec& x, Vec& y) { return x + y; }, grad_data, dim_size);
vec::map2(
[sum](Vec x, Vec y) { return x - ((y.exp()) * Vec(sum)); },
grad_input_data,
grad_data,
output_data,
dim_size);
} else {
auto sum = vec::map2_reduce_all<scalar_t>(
[](Vec x, Vec y) { return x * y; },
[](Vec x, Vec y) { return x + y; },
grad_data,
output_data,
dim_size);
vec::map2(
[sum](Vec x, Vec y) { return (x - Vec(sum)) * y; },
grad_input_data,
grad_data,
output_data,
dim_size);
}
}
});
}
Source
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free