C ++:初始化intel SIMD内在类成员

时间:2014-04-14 21:42:52

标签: c++ intel avx

我不明白为什么注释和未注释的行不会产生相同的结果(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.  */

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

非常感谢

2 个答案:

答案 0 :(得分:2)

这与DR 1467有关,它不允许使用列表初始化语法来复制聚合。最近针对GCC中的类修复了这个问题,我将修复扩展到了r209449中的向量。 Gcc-4.10编译你的代码。

答案 1 :(得分:0)

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

也许

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

会奏效。