Force vectorization of the source loop using SIMD instructions and/or generate vector variants of the function(s) using a directive:
| Target | Directive |
|---|---|
| Source loop | #pragma omp simd |
| Inner function definition or declaration | #pragma omp declare simd |
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]);
}
...struct A {
#pragma omp declare simd
virtual double foo(double x) { return x+1; }
};
...- omp simd, omp declare simd in OpenMP* Pragmas Summary
- Vectorization Resources for Intel® Advisor Users