如果在函数中我需要一个固定的shuffle掩码,我应该将其设置为const
还是static const
?
const __m128i SHUFFLE_MASK = _mm_setr_epi8(0, 4, 8, 12, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1);
static const __m128i SHUFFLE_MASK = _mm_setr_epi8(0, 4, 8, 12, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1);
通常,编译时常数数据的_mm_setr_epi8
最终编译为加载(或用作内存操作数)的16B只读数据块。(在gcc -S
asm输出中查找类似.LC0
的标签)。这已经是最优的了。
Emil Styrke评论说,static const
最终可能包含检查静态位置是否已初始化的代码。由于没有任何好处,而且可能会有成本(至少在旧的gcc上,我自己没有检查过),因此避免向量的static const
(尤其是当声明和初始值设定项在函数内部时)。
IDK如果gcc曾经将数据中有模式的setr
优化为movd
和shuffle,或者类似的东西。如果是这样,那么您可能希望避免使用指令生成常量,而不是将其作为内存操作数。
不过,这似乎是一个不太可能的情况。但是,如果您需要击败这样的优化,您可能可以使用静态(文件范围)char
数组来保持常量,并将指针投射到向量类型。