【发布时间】:2014-04-14 21:42:51
【问题描述】:
我不明白为什么注释和未注释的行不会产生相同的结果(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
我不明白,因为x 和y 是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. */
我不明白这是什么意思,但感觉可能是相关的:)
非常感谢
【问题讨论】:
-
Bug,请向gcc的bugzilla报告。
-
看起来像一个错误。顺便说一句,由于您已经在使用 _mm256_setzero_ps() ,因此没有理由添加 f,只需使用
_mm256_set1_ps()或_mm256_broadcast_ps()直接使用广播。以您的方式进行操作的唯一原因是您不必使用内在函数。定义__m256 zero={}并执行zero + fstackoverflow.com/questions/21727331/… -
好点;我肯定会改用 _mm256_set1_ps(f) 。但是,使用 _mm256_set1_ps 时问题仍然存在。将向 GCC bugzilla 报告。非常感谢你们