Here is the brief summarized debate of whether SIMD vectors should have operator== return a SIMD vector or a boolean

operator== Should Returns a SIMD Vector Camp

  • That’s what state-of-arts C++ libraries do
  • It’s what people want for the most of times
  • If returning a bool, it is not clear what the semantics is (all? at least one?)
  • Boolean returning simd vector operator== can be misuse
    • e.g. std::simd x, y, z; auto result = (x == y) * z; /* spreading here */
  • Generic code that works both on scalars and vectors need operator== returning vector

operator== Should Returns a Bool Camp

  • regular typesoperator== return bool
    • Returning a vector can break generic code which expect operator== to return bool
  • Rust’s std::simd does that
    • Lesley: this is related to how Rust’s equality is implemented (Eq trait), so in C++ the situation is different

Third Option: operator== Should not Exist

That’s my take. And it seems to solve a large numbers of concerns above

Cons

  • Can’t easily take advantage of generic code (both the above two options do it somewhat)
  • using explicit functions looks quite ugly for basic math stuff

Fourth Option: Implicitly Convert a simd<bool> to bool

IMO just horrible

References