SSE:我应该将shuffle mask设置为静态变量吗?

时间:2014-01-17 10:57:05

标签: c++ sse intrinsics

如果在函数中我需要一个固定的随机模板,我应该将其设置为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);

1 个答案:

答案 0 :(得分:1)

通常_mm_setr_epi8编译时常量数据最终会编译为16B块的只读数据(被加载(或用作内存操作数))。 (在.LC0 asm输出中查找gcc -S之类的标签。这已经是最佳的了。

Emil Styrke评论说static const最终可能会包含检查静态位置是否已初始化的代码。由于没有任何好处和可能的成本(至少在较旧的gcc上没有检查过自己),因此请避免使用static const向量(特别是当声明和初始化程序在函数内时)。

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

但这似乎是一个非常不可能的案例。但是如果你需要打败这样的优化,你可以使用静态(文件范围)char数组来保存你的常量,并将指针转换为矢量类型。