gpt4 book ai didi

c++ - 为什么这个自动矢量化器关心构造函数/析构函数?

转载 作者:可可西里 更新时间:2023-11-01 15:27:53 25 4
gpt4 key购买 nike

这是一个SSCCE :

class Vec final {
public:
float data[4];

inline Vec(void) {}
inline ~Vec(void) {}
};
Vec operator*(float const& scalar, Vec const& vec) {
Vec result;
#if 1
for (int k=0;k<4;++k) result.data[k]=scalar*vec.data[k];
#else
float const*__restrict src = vec.data;
float *__restrict dst = result.data;
for (int k=0;k<4;++k) dst[k]=scalar*src[k];
#endif
return result;
}

int main(int /*argc*/, char* /*argv*/[]) {
Vec vec;
Vec scaledf = 2.0f * vec;
return 0;
}

编译时,MSVC 2013 通知我 (/Qvec-report:2)

main.cpp(11) : info C5002: loop not vectorized due to reason '1200'

这意味着“[l]oop 包含循环携带的数据依赖性”。

我注意到注释 Vec 的构造函数或析构函数(编辑:或默认它们,例如 Vec()=default;)会导致它成功矢量化。我的问题:为什么?


注意:切换 #if 也会使其工作。 __restrict 很重要。
注意:将 float const& scalar 更改为 float const scalar 会导致矢量化报告 1303(矢量化不会成功),我怀疑是因为引用可以直接传递到 SSE 寄存器,而按值传递需要另一个拷贝。

最佳答案

为什么要声明一个空的非虚拟析构函数 inline ~Vec(void) {} 和一个空的默认构造函数 inline Vec(void) {}

因此,编译器不会生成默认的复制构造函数。因此代码 return result; 没有它就无法编译,因为这需要将结果复制到一个临时返回的对象中(这可能不是你想要的)。

要么定义复制构造函数,要么根本不定义空构造函数和析构函数。

关于c++ - 为什么这个自动矢量化器关心构造函数/析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30269865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com