我几乎没有成功迫使g ++生成对虚函数的向量(aka omp simd
)调用。考虑基类
class vecclass_v {
public:
#pragma omp declare simd simdlen(4)
virtual double vecf(double v1, double v2) = 0;
}
和实现(应该)矢量化vecf
class vecclass : public vecclass_v {
public:
#pragma omp declare simd simdlen(4)
double vecf(double v1, double v2);
};
实施位于cxx
文件中。查看目标文件,我可以看到g ++正确地为派生类生成矢量化函数的实例。但调用虚函数并未解析为向量化调用。它使用标量成员实例,例如,在像这样的用例中
vecclass_v *ob = [get an instance of vecclass somewhere]
ob->vecf(a, b); // this should be vectorized, but is not
英特尔编译器支持矢量化虚拟功能(https://software.intel.com/en-us/articles/virtual-vector-function-supported-in-intel-c-compiler-170)。 g ++是否支持这一点,但我不能使用它,或者这还没有实现?