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

Reply via email to