C++ 加载128位混合浮点+;整型数据?
我有一个结构,其组成如下:C++ 加载128位混合浮点+;整型数据?,c++,assembly,x86,sse,avx,C++,Assembly,X86,Sse,Avx,我有一个结构,其组成如下: 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 compo
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寄存器中,并检查是否设置了单个位
我发现
\u mm\u loadu\u si128()
但是我的数据混合了整数和浮点数?实际上,如果(sizeof(B)==2*sizeof(uint64\u t)
,那么我认为没有理由不按照你的建议去做。但是如果速度很重要(而且看起来很重要),您应该将B
对象与128位边界对齐,以便可以使用\u mm\u load\u si128
而不是\u mm\u loadu\u si128
编辑以添加:事实上,在64位模式下,仅使用常规操作码可能更快。例如:
mov rax,[rsi]
or rax,[rsi+8]
jnz BitSet
即使在32位模式下,它可能会更快。你必须进行实验。实际上,如果
(sizeof(B)==2*sizeof(uint64\u t)
,那么我看没有理由不按照你的建议去做。但是如果速度很重要(而且看起来很重要),您应该将B
对象与128位边界对齐,以便可以使用\u mm\u load\u si128
而不是\u mm\u loadu\u si128
编辑以添加:事实上,在64位模式下,仅使用常规操作码可能更快。例如:
mov rax,[rsi]
or rax,[rsi+8]
jnz BitSet
即使在32位模式下,它可能会更快。你必须进行实验。实际上,如果
(sizeof(B)==2*sizeof(uint64\u t)
,那么我看没有理由不按照你的建议去做。但是如果速度很重要(而且看起来很重要),您应该将B
对象与128位边界对齐,以便可以使用\u mm\u load\u si128
而不是\u mm\u loadu\u si128
编辑以添加:事实上,在64位模式下,仅使用常规操作码可能更快。例如:
mov rax,[rsi]
or rax,[rsi+8]
jnz BitSet
即使在32位模式下,它可能会更快。你必须进行实验。实际上,如果
(sizeof(B)==2*sizeof(uint64\u t)
,那么我看没有理由不按照你的建议去做。但是如果速度很重要(而且看起来很重要),您应该将B
对象与128位边界对齐,以便可以使用\u mm\u load\u si128
而不是\u mm\u loadu\u si128
编辑以添加:事实上,在64位模式下,仅使用常规操作码可能更快。例如:
mov rax,[rsi]
or rax,[rsi+8]
jnz BitSet
即使在32位模式下,速度也可能会更快。您必须进行试验。您只想检查是否至少设置了一位?只是为了确保,在浮点上执行此操作时,您希望得到什么?对于整数(和两位补码),这与检查它是否不是0相同,但浮点更复杂=>目的到底是什么?结构的实例总是包含所有4个变量和一些值?它不能是emtpy。编辑:并且union内容也不会使其为空。“全部64位为零”-你默默地假设
bool
有7个填充位,所有填充位都是零。你的问题是128位,你的评论是64位。你应该让bool
sint8\t
s,这样我们就有了大小和值的保证。但是,撇开这一点不谈:是的,你可以像这样加载两个64位并集,不管它们是整数的混合r数据和浮点值;由于您有AVX,您可能也有SSE4.1,在这种情况下,pcmpeqq
指令(可通过\uuuuuum128i\umm\ucmpeq\uepi64(\uuuuuuum128i,\uuuuuum128i)
访问)这正是您想要的。您只想检查是否至少设置了一位?只是为了确保,在浮点上执行此操作时,您希望得到什么?对于整数(和两位补码),这与检查它是否不是0相同,但浮点更复杂=>目的到底是什么?结构的实例总是包含所有4个变量和一些值?它不能是emtpy。编辑:并且union内容也不会使其为空。“全部64位为零”-你默默地假设bool
有7个填充位,所有填充位都是零。你的问题是128位,你的评论是64位。你应该让bool
sint8\t
s,这样我们就有了大小和值的保证。但是,撇开这一点不谈:是的,你可以像这样加载两个64位并集,不管它们是整数的混合r数据和浮点值;由于您有AVX,您可能也有SSE4.1,在这种情况下,pcmpeqq
指令(可通过\uuuuuum128i\umm\ucmpeq\uepi64(\uuuuuuum128i,\uuuuuum128i)
访问)这正是您想要的。您只想检查是否至少设置了一位?只是为了确保,在浮点上执行此操作时,您希望得到什么?对于整数(和两位补码),这与检查它是否不是0相同,但浮点更复杂=>目的到底是什么?结构的实例总是包含所有4个变量和一些值?它不能是emtpy。编辑:并且union内容也不会使其为空。“全部64位为零”-你默默地假设bool
有7个填充位,所有填充位都是零。你的问题是128位,你的评论是64位。你应该让bool
sint8\t
s,这样我们就有了大小和值的保证。但是,撇开这一点不谈:是的,你可以像这样加载两个64位并集,不管它们是整数的混合r数据和浮点值;由于您有AVX,您可能也有SSE4.1,在这种情况下,pcmpeqq
指令(可通过\uuuuuum128i\umm\ucmpeq\uepi64(\uuuuuuum128i,\uuuuuum128i)
访问)这正是您想要的。您只想检查是否至少设置了一位?只是为了确保,在浮点上执行此操作时,您希望得到什么?对于整数(和两位补码),这与检查它是否不是0相同,但浮点更复杂=>具体用途是什么?结构实例总是包含所有4个变量和一些值?它不能是emtpy。编辑:和