C++:初始化英特尔SIMD内部类成员



我不明白为什么注释和未注释的行不会产生相同的结果(Linux GCC,启用了C++11标志):

#include "immintrin.h"

typedef __m256 floatv;
struct floatv2{
public:
    //floatv2(const float f):x(_mm256_setzero_ps() + f ), y(_mm256_setzero_ps() + f ) {}; // succeeds
    floatv2(const float f):x{_mm256_setzero_ps() + f }, y{_mm256_setzero_ps() + f } {}; // fails
//private:
    floatv x, y;
};

当试图编译未注释的行时,我得到以下错误:

error: cannot convert ‘__m256 {aka __vector(8) float}’ to ‘float’ in initialization

我不理解,因为xy是floatv,而不是float,所以不需要转换。。。

此外,在一些更复杂的代码中,第一个版本会产生内存访问冲突。幕后有什么令人讨厌的事情吗?

PS:在__m256的定义之上,在avxintrin.h中,有以下评论:

/* The Intel API is flexible enough that we must allow aliasing with other
   vector types, and their scalar components.  */

我不明白这意味着什么,但我觉得这可能是相关的:)

非常感谢

这与DR 1467有关,后者不允许使用列表初始化语法来复制聚合。这是最近为GCC中的类修复的,我在r209449中将修复扩展到了向量。Gcc-4.10编译您的代码。

可能_mm256_setzero_ps()+f返回一个float而不是floatv,因为f是float。因此,您不能使用{}用float初始化floatv值(x和y),beacuse{}-初始化不允许缩小(隐式转换)。

也许

x{static_cast<__m256>(_mm256_setzero_ps() + f) }

将起作用。

最新更新