【发布时间】:2017-07-30 13:01:50
【问题描述】:
我正在查看为我的代码生成的程序集(使用 Visual Studio 2017),并注意到 _mm_load_ps 通常(总是?)编译为 movups。
我使用 _mm_load_ps 的数据是这样定义的:
struct alignas(16) Vector {
float v[4];
}
// often embedded in other structs like this
struct AABB {
Vector min;
Vector max;
bool intersection(/* parameters */) const;
}
现在当我使用这个构造时,会发生以下情况:
// this code
__mm128 bb_min = _mm_load_ps(min.v);
// generates this
movups xmm4, XMMWORD PTR [r8]
由于 alignas(16),我期待 movaps。在这种情况下,我是否需要其他东西来说服编译器使用 movaps?
编辑:我的问题与this question 不同,因为我没有遇到任何崩溃。该结构是专门对齐的,我也使用对齐分配。相反,我很好奇为什么编译器将 _mm_load_ps (对齐内存的内在属性)切换到 movups。如果我知道 struct 分配在一个对齐的地址并且我通过 this* 调用它,那么使用 movaps 是安全的,对吧?
【问题讨论】:
-
您特别想要
movaps的目的是什么? -
@J... 是的 Core2。据我所知,只要地址实际上是对齐的,对任何更新的东西都没有关系
-
另外,请通读Remarks section here。 (这指的是
__declspec(align(#)),但由于VS2015alignas支持被实现为相同的单板)。 -
@J... 是的,
_mm_load_ps也可以这样做,尽管它不是必须的 -
在 VS 和 ICC 上,如果您为 AVX 或更高版本进行编译,编译器几乎不会发出对齐的 SIMD 加载/存储问题。这样做是允许的,因为它不会丢失功能,并且从 Nehalem 开始的所有处理器在地址对齐时都不会因使用未对齐的加载/存储而受到惩罚。他们这样做是因为它使编译器更简单(不必在对齐/未对齐之间进行选择)并且如果它未对齐也不会崩溃。虽然我强烈不同意后者,因为我更喜欢它实际上在未对齐时崩溃,因为这是一个应该修复而不是隐藏的错误。
标签: c++ assembly sse intrinsics visual-studio-2017