SSE:我是否应该将shuffle掩码设置为静态变量
SSE: Should I set a shuffle mask as static variable or not?
如果在函数中我需要一个固定的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
数组来保持常量,并将指针投射到向量类型。
相关文章:
- 位移操作和位掩码未检测到重复字符
- OpenCV - 带有掩码的absdiff
- 生成前缀位掩码
- 如何从__m64值的 lsb 创建 8 位掩码?
- 如何对无符号长 int 进行位掩码?
- 删除K的背景掩码-意味着Python或C++中的集群/
- 如何在C++中优雅地处理位掩码
- 将uint64_t位掩码转换为 std::布尔数组
- 使输入二进制掩码适应 ITK 网格生成器
- 如何从 getifaddr 读取子网掩码
- 优化从子位掩码生成父位掩码
- 基于模式创建位掩码作为 constexpr
- C++设置"blank"或重置 ifstrean (ios) 的异常掩码
- 为什么 getline() 在异常掩码未设置为 eofbit 时抛出'std::ios_base::failure'?
- 找出哪个模块设置处理器亲和力掩码
- 位掩码:通过集合方法设置对象的不同状态
- SSE:我是否应该将shuffle掩码设置为静态变量
- 选择位掩码中与选择器位图中的1位重叠的设置位的跨度
- 如何在不使用位掩码的情况下设置Integer中的位
- Windows设置线程关联掩码无效