SSE:我是否应该将shuffle掩码设置为静态变量



如果在函数中我需要一个固定的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 -Sasm输出中查找类似.LC0的标签)。这已经是最优的了。

Emil Styrke评论说,static const最终可能包含检查静态位置是否已初始化的代码。由于没有任何好处,而且可能会有成本(至少在旧的gcc上,我自己没有检查过),因此避免向量的static const(尤其是当声明和初始值设定项在函数内部时)。

IDK如果gcc曾经将数据中有模式的setr优化为movd和shuffle,或者类似的东西。如果是这样,那么您可能希望避免使用指令生成常量,而不是将其作为内存操作数。

不过,这似乎是一个不太可能的情况。但是,如果您需要击败这样的优化,您可能可以使用静态(文件范围)char数组来保持常量,并将指针投射到向量类型。

最新更新