我有一个具有以下组成的结构:
static constexpr uint64_t emptyStructValue { 0 };
union MyStruct {
explicit MyStruct(uint64_t comp) : composite(comp){}
struct{
int16_t a;
bool b;
bool c;
float d;
};
uint64_t composite = 0;
bool hasValue(){
return composite != emptyStructValue;
}
};
我在另一个对象中有两个这样的结构:
class B{
Struct s1;
Struct s2;
};
我想知道,给定类型 B 的对象,我如何将所有 128 位加载到 SSE 寄存器并检查是否设置了单个位?
我找到了 _mm_loadu_si128()
但我的数据混合了整数和 float ?
最佳答案
实际上,如果 (sizeof(B) == 2*sizeof(uint64_t)
,那么我认为没有理由不按照你的建议去做。但是如果速度很重要(而且看起来就像它一样),你应该将你的 B
对象对齐到 128 位边界,这样你就可以使用 _mm_load_si128
而不是 _mm_loadu_si128
。
编辑添加:事实上,在 64 位模式下,使用常规操作码可能会更快。像这样的东西:
mov rax,[rsi]
or rax,[rsi+8]
jnz BitSet
即使在 32 位模式下,它也可能会更快。您将不得不进行试验。
关于c++ - 加载 128 位混合 float+int 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30693828/