初始化 SSE 常量的位置
Where to initialize SSE constants
我的问题是关于在基于内部函数的代码中定义__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 上进行编译。
选项 A 可能没问题 - 编译器在内联此函数时应该做正确的事情,并且应该将掩码常量从任何循环中提升出来,但根据我的经验,最安全的选择,特别是如果您希望它跨多个平台/编译器可靠地工作,是将其重构为稍微不那么优雅但可能更有效的形式:
__m128i Foo::DoMasking(const __m128i value, const __m128i mask) const
{
return _mm_and_si128(value, mask);
}
void Foo::DoLotsOfMasking(...)
{
const __m128i mask = _mm_set1_epi32(0x00FF0000);
for (int i = 0; ...; ...)
{
// ...
v[i] = DoMasking(x[i], mask);
// ...
}
}
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 将值指定给向量(2D)的向量中的某个位置
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 非常量变量只读位置的赋值
- 常量引用的内存位置
- 当原始数据是常量时,修改指针指向的位置是 UB 吗?
- 非常量调用 const 成员函数失败,只读位置C++
- 指针或参照的常量位置
- 将强制转换为较窄的常量位置时是否暗示到常量?
- 使用新的位置来创建静态常量指针,指向静态内存缓冲区
- 测试静态常量成员的存储位置
- C++:I用不同的位置调用字符串 substr 两次,转换为常量字符 *,它们返回相同的,为什么
- 初始化 SSE 常量的位置
- 在c++类+ final常量中放置struct和enum的位置
- 编写JIT编译器时存储代码常量的位置
- 为什么迭代器向量::插入在填充后无效:迭代器插入(const_iterator位置,size_type n,常量value_type和val);
- 在C++中,指针和带有常量的与号位置
- 参数传递中常量位置的 c++ 标准是什么?