Pointwise Step Function
Issue #142
new
Hi Klaus!
I have another feature request: a pointwise step function. I'm not sure how good of an idea this is because the definition at H(x=0)
varies. We use H(x=0)=1.0
. Here's what I've implemented for doubles:
namespace blaze { template <typename T> BLAZE_ALWAYS_INLINE SIMDdouble step_function(const SIMDf64<T>& v) noexcept #if BLAZE_AVX512F_MODE || BLAZE_MIC_MODE { return _mm512_set_pd((~v)[7] < 0.0 ? 0.0 : 1.0, (~v)[6] < 0.0 ? 0.0 : 1.0, (~v)[5] < 0.0 ? 0.0 : 1.0, (~v)[4] < 0.0 ? 0.0 : 1.0, (~v)[3] < 0.0 ? 0.0 : 1.0, (~v)[2] < 0.0 ? 0.0 : 1.0, (~v)[1] < 0.0 ? 0.0 : 1.0, (~v)[0] < 0.0 ? 0.0 : 1.0); } #elif BLAZE_AVX_MODE { return _mm256_set_pd((~v)[3] < 0.0 ? 0.0 : 1.0, (~v)[2] < 0.0 ? 0.0 : 1.0, (~v)[1] < 0.0 ? 0.0 : 1.0, (~v)[0] < 0.0 ? 0.0 : 1.0); } #elif BLAZE_SSE2_MODE { return _mm_set_pd((~v)[1] < 0.0 ? 0.0 : 1.0, (~v)[0] < 0.0 ? 0.0 : 1.0); } #else { return SIMDdouble{(~v).value < 0.0 ? 0.0 : 1.0}; } #endif BLAZE_ALWAYS_INLINE double step_function(const double& v) noexcept { return v < 0.0 ? 0.0 : 1.0; } struct StepFunction { explicit inline StepFunction() {} template <typename T> BLAZE_ALWAYS_INLINE decltype(auto) operator()(const T& a) const noexcept { return step_function(a); } template <typename T> BLAZE_ALWAYS_INLINE decltype(auto) load(const T& a) const noexcept { BLAZE_CONSTRAINT_MUST_BE_SIMD_PACK(T); return step_function(a); } }; } // namespace blaze template <typename VT, bool TF> BLAZE_ALWAYS_INLINE decltype(auto) step_function( const blaze::DenseVector<VT, TF>& vec) noexcept { return blaze::map(~vec, blaze::StepFunction{}); }
For the AVX512 case it may be more efficient to user masked vectorized operations, but I haven't studied this.
If because of the ambiguity at x=0
you don't want this in Blaze that's totally understandable :)
Cheers,
Nils
Hi Nils!
Thanks for the proposal. I agree that a pointwise step function would be useful for many applications. I will consider it for one of the next releases. Also thanks a lot for the source code, this makes it easier.
Best regards,
Klaus!