In my experience there is no single SIMD library that wraps all possible set of
vector instructions across the most common architectures and at the same time
provides support for all popular compilers while supporting C and C++11/14. (I
mention C because there is an issue for Arrow support in C,
https://issues.apache.org/jira/browse/ARROW-1851). I even at one point wanted
to solve this problem via a multi-layer library but found that it would require
more time and access to a variety of computing resources, see (or not)
https://github.com/edponce/libsimdcpp. The main reason is that SIMD libraries
are commonly created on a as-needed basis and thus, provide a project-specific
subset of vector ISAs.
In terms of performance, most libraries (or better said, most common vector
instructions) are wrapped very similarly (many times, identically), so
performance should be comparable across SIMD libraries (assuming same
compiler/architecture). Given that SIMD functions have very simple bodies, they
are usually inlined during compilation. SIMD libraries tend to be header-only.
I suggest to care about performance on specific SIMD operations of interest
that will be placed in hotspots. Examples of operations that tend to differ in
implementation between SIMD libraries are reductions, operands of different
type/size, arithmetic shortcuts in modulus/division, conditional masks, and
custom ones.
Aspects that I consider important for selecting a SIMD library are:
1) Coverage of vector ISA, architectures supported, and compilers supported
a) These requirements are project-dependent
2) Library APIs: Does it support function-based paradigm? Object-oriented?
Operator overloading for common arithmetic/logical operators? What conditional
predicates does it support?
3) Modularity and how is easy it is to extend?
4) Maintainer's support
I personally do not have a "favorite" candidate, but did browsed xsimd and
agree that we can fill/improve the gaps needed for Arrow.
~Eduardo