【发布时间】:2013-10-10 16:30:31
【问题描述】:
我的问题是关于在基于内部函数的代码中定义 __m128/__m128i 编译时间常数的最有效位置。
考虑两个选项:
选项 A
__m128i Foo::DoMasking(const __m128i value) const
{
//defined in method
const __m128i mask = _mm_set1_epi32(0x00FF0000);
return _mm_and_si128(value, mask);
}
选项 B
//Foo.h
const __m128i mask = _mm_set1_epi32(0x00FF0000);
//Foo.cpp
__m128i Foo::DoMasking(const __m128i value) const
{
return _mm_and_si128(value, mask);
}
- 选项 A 会导致性能损失,还是会被优化为选项 B 的等效项?
- 还有更好的选项C吗?
- 答案是否会根据方法是否内联而改变?
-
_mm_set1_epi32/__mm_set_epi32是加载常量的最佳方式吗?我见过一些问题,其中生成了int[4]并将其转换为__m128i。
我知道所有这些问题的正确答案是“检查反汇编!”,但我在生成和解释它方面都缺乏经验。
我正在 MSVC 上进行最大优化的编译。
【问题讨论】: