SSE数据类型和原语

时间:2011-08-10 01:54:57

标签: c++ visual-c++ optimization sse strict-aliasing

在网上的大多数教程或代码片段中都会看到以下内容:

float *arr= (float*) _aligned_malloc(length * sizeof(float), 16);
__m128 *m1 = (__m128*)arr;

这是否违反了严格的别名规则?我认为它确实如此,但是当然所有这些教程编写者都不会为了方便而忽略它,因为__m128是一个包含float的联合[4],也许我误解了一些错综复杂的部分。

2 个答案:

答案 0 :(得分:2)

尚未违反 - 但是。但是,通过一个指针写入并读取另一个指针会违反严格的别名。

相反,您应该使用以下功能:

答案 1 :(得分:1)

这是GCC的编译器特定答案

xmmintrin header for GCC 4.4.3定义了以下内容:

typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));

所以,是的,你违反了严格的别名,但你可以使用那种类型。奇怪的是,__v4sf类型未标记为__may_alias__,因此无法以此方式使用。