Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 加载128位混合浮点+;整型数据?_C++_Assembly_X86_Sse_Avx - Fatal编程技术网

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
s
int8\t
s,这样我们就有了大小和值的保证。但是,撇开这一点不谈:是的,你可以像这样加载两个64位并集,不管它们是整数的混合r数据和浮点值;由于您有AVX,您可能也有SSE4.1,在这种情况下,
pcmpeqq
指令(可通过
\uuuuuum128i\umm\ucmpeq\uepi64(\uuuuuuum128i,\uuuuuum128i)
访问)这正是您想要的。您只想检查是否至少设置了一位?只是为了确保,在浮点上执行此操作时,您希望得到什么?对于整数(和两位补码),这与检查它是否不是0相同,但浮点更复杂=>目的到底是什么?结构的实例总是包含所有4个变量和一些值?它不能是emtpy。编辑:并且union内容也不会使其为空。“全部64位为零”-你默默地假设
bool
有7个填充位,所有填充位都是零。你的问题是128位,你的评论是64位。你应该让
bool
s
int8\t
s,这样我们就有了大小和值的保证。但是,撇开这一点不谈:是的,你可以像这样加载两个64位并集,不管它们是整数的混合r数据和浮点值;由于您有AVX,您可能也有SSE4.1,在这种情况下,
pcmpeqq
指令(可通过
\uuuuuum128i\umm\ucmpeq\uepi64(\uuuuuuum128i,\uuuuuum128i)
访问)这正是您想要的。您只想检查是否至少设置了一位?只是为了确保,在浮点上执行此操作时,您希望得到什么?对于整数(和两位补码),这与检查它是否不是0相同,但浮点更复杂=>目的到底是什么?结构的实例总是包含所有4个变量和一些值?它不能是emtpy。编辑:并且union内容也不会使其为空。“全部64位为零”-你默默地假设
bool
有7个填充位,所有填充位都是零。你的问题是128位,你的评论是64位。你应该让
bool
s
int8\t
s,这样我们就有了大小和值的保证。但是,撇开这一点不谈:是的,你可以像这样加载两个64位并集,不管它们是整数的混合r数据和浮点值;由于您有AVX,您可能也有SSE4.1,在这种情况下,
pcmpeqq
指令(可通过
\uuuuuum128i\umm\ucmpeq\uepi64(\uuuuuuum128i,\uuuuuum128i)
访问)这正是您想要的。您只想检查是否至少设置了一位?只是为了确保,在浮点上执行此操作时,您希望得到什么?对于整数(和两位补码),这与检查它是否不是0相同,但浮点更复杂=>具体用途是什么?结构实例总是包含所有4个变量和一些值?它不能是emtpy。编辑:和