I'm looking for a free/open source C/C++ (either is acceptable) library of vectorized versions of common math functions (such as ln or exp) similar to Intel's Vector Math Library for Linux. I'd like a library that would provide me with the ability to write something like:
double a[ARRAY_SIZE], b[ARRAY_SIZE];
for (int i = 0; i < ARRAY_SIZE; ++i) {
a[i] = ln(b[i]);
}
as:
double a[ARRAY_SIZE], b[ARRAY_SIZE];
vectorized_ln(a, b, ARRAY_SIZE);
and have it use the full power of the SIMD instructions available on the Intel and AMD architectures. The development environment consists of GNU tools running on Linux. Intel's Math Kernel Library contains something called Vector Math Library which advertises "vector implementations of computationally intensive core mathematical functions" including basic functions, trig functions, etc, so I'm looking for something like that but for free.
I developed an open-source (BSD) Yeppp! mathematical library, which provides some vector elementary functions (log, exp, sin, cos, tan), and is competitive with MKL in performance. Here is an example of using vector logarithm function from Yeppp!
Felix von Leitner has written an extensive presentation on the actual assembly produced by various c compilers.
His notes on vectorization of simple operations start on slide 28.
For GCC 4.4 and a memset
type loop
Slide 41 is entitled "Outsmarting the Compiler - simd-shift" and concludes that "gcc is smarter than the video codec programmer on all platforms"
Slide 42 is another case where gcc will automatically vectorize naive code.
All of which adds up to check first to see if the compiler you are using will simply deal with it for you.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With