Vectorize call(s) to virtual method

Force vectorization of the source loop using SIMD instructions and/or generate vector variants of the function(s) using a directive:
TargetDirective
Source loop#pragma omp simd
Inner function definition or declaration#pragma omp declare simd

Example (original code)

struct A {
    virtual double foo(double x) { return x+1; }
};
...
struct A {
    virtual double foo(double x) { return x+1; }
};

struct B : public A {
    double foo(double x) override { return x-1; }
};

 ...

A* obj = new B();

double sum = 0.0;
#pragma omp simd reduction(+:sum)
for (int k = 0; k < N; ++k) {
    // indirect call to virtual method
    sum += obj->foo(a[k]);
}
...

Example (revised code)

struct A {
    #pragma omp declare simd
    virtual double foo(double x) { return x+1; }
};
 ...

Read More