标签: sse

_mm_crc32 给出与手动版本不同的结果

我有以下代码(手动版本来自阿德勒的答案

 #include <iostream>
 #include <nmmintrin.h>

     #define POLY2 0x82f63b78  
    uint32_t crc32c2(uint32_t crc, const unsigned char *buf, size_t len)
    {
        int k;

        crc = ~crc;
        while (len--) {
            crc ^= *buf++;
            for (k = 0; k < 8; k++)
                crc = crc & 1 ? (crc >> 1) ^ POLY2 : crc >> 1;
        }
        return ~crc;
    }

    int main(int argc, char **argv)
    {
        const unsigned int val = 5;
        std::cout << std::hex << crc32c2(0,(const unsigned char*)&val,4) << std::endl;   
        std::cout …
Run Code Online (Sandbox Code Playgroud)

c++ sse crc intrinsics

2
推荐指数
1
解决办法
824
查看次数

从 XMM 迁移到 YMM

考虑:

movdqa xmm0, xmmword ptr [rcx]
movdqa xmm1, xmmword ptr [rcx + 16]
movdqa xmm2, xmmword ptr [rcx + 32]
movdqa xmm3, xmmword ptr [rcx + 48]
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常。rcx是 32 位 uint 数组的第一个元素的地址。

ymm但是,当尝试以类似的方式使用时:

vmovdqa ymm0, ymmword ptr [rcx]
vmovdqa ymm1, ymmword ptr [rcx + 32]
Run Code Online (Sandbox Code Playgroud)

该代码随机抛出 sigsegvs: Exception thrown at 0x00007FF95ACC102C (Asm.dll) in Asm.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

为什么,我怎样才能让它发挥作用?

我的CPU是i5-10210u(支持AVX-256)。在 X64 发布/调试中运行。

assembly sse masm simd avx

2
推荐指数
1
解决办法
590
查看次数

2
推荐指数
1
解决办法
145
查看次数

SSE 和 AVX MoveMask 的用途是什么

问题

  1. MoveMask 的目的或意图是什么?
  2. 学习如何使用 x86/x86-64 汇编/SSE/AVX 的最佳地点是哪里?
  3. 我可以更有效地编写代码吗?

提问原因

我有一个用 F# for .NET 编写的使用 SSE2 的函数。我使用 AVX2 写了同样的东西,但根本问题是相同的。a 的预期目的是什么MoveMask?我知道它对我的目的有效,我想知道为什么。

我正在迭代两个 64 位浮点数组ab,测试它们的所有值是否匹配。我正在使用该CompareEqual方法(我相信该方法正在包装对 的调用__m128d _mm_cmpeq_pd)一次比较多个值。然后我将该结果与64Vector1280.0浮点数进行比较。我的推理是,在值不匹配的情况下,结果CompareEqual将给出一个值。0.0到目前为止,这是有道理的。

然后我Sse2.MoveMask对与零向量的比较结果使用该方法。我之前曾研究过使用SSEand for 匹配,并且我看到了人们用于测试非零值AVX的示例。MoveMask我相信这种方法正在使用int _mm_movemask_epi8英特尔内在函数。我已包含 F# 代码和 JIT 的程序集。

这真的是一个目的吗MoveMask,还是只是一个令人高兴的巧合,它可以达到这些目的。我知道我的代码有效,我想知道它为什么有效。

F# 代码

#nowarn "9" "51" "20" // Don't want warnings about pointers

open System
open FSharp.NativeInterop
open …
Run Code Online (Sandbox Code Playgroud)

x86 f# sse avx .net-core

2
推荐指数
1
解决办法
1879
查看次数

尝试编写 Gerd Isenberg 的 Bit Scan Forward 的矢量化实现作为练习

我正在尝试编写 BSF 的矢量化实现作为练习,但我陷入困境,它不起作用。

算法:

 short bitScanForward(int16_t bb)
 {
     constexpr uint16_t two = static_cast<uint16_t>(2);
     constexpr uint16_t zero = static_cast<uint16_t>(0);
     uint16_t lsb;
     bb &= -bb;
     lsb = (unsigned short)bb
               | (unsigned short)(bb >> short(8));
     return static_cast<short>(((((((unsigned short)(bb >> 
       short(8)) != zero) * two)
    + ((lsb & unsigned short(0xf0f0)) != zero)) * two)
    + ((lsb & unsigned short(0xcccc)) != zero)) * two)
    + ((lsb & unsigned short(0xaaaa)) != zero);
}
Run Code Online (Sandbox Code Playgroud)

参见:Gerd Isenberg BSF

我的矢量代码:

 [[nodiscard]] inline __m128i _mm_cmpneq_epi16(const __m128i& a, const __m128i& …
Run Code Online (Sandbox Code Playgroud)

c++ sse bit-manipulation simd vectorization

2
推荐指数
1
解决办法
483
查看次数

“if consteval”提案文件中的“SSE 4.2 insanity”是什么意思?

我正在阅读一篇关于if consteval (\xc2\xa73.2)的 C++ 论文,并看到一段显示constexpr strlen实现的代码:

\n
constexpr size_t strlen(char const* s) {\n    if constexpr (std::is_constant_evaluated()) {\n        for (const char *p = s; ; ++p) {\n            if (*p == \'\\0\') {\n                return static_cast<std::size_t>(p - s);\n            }\n        }    \n    } else {\n        __asm__("SSE 4.2 insanity");        \n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我是来询问__asm__else分支中的语句的。

\n

我知道这是幽默,并不意味着要认真对待,但我仍然决定做一些研究,以防有人已经解释过。\n当我用谷歌搜索引用的消息时,我得到的结果不到 10 个,全部都是关于这段代码的.\n然后我研究了什么是SSE 4.2,发现它是一个CPU指令集,所以我真的不知道它在C++论文中出现的内容,有人有解释吗?\n感谢那些会阅读的人我的帖子。

\n

c++ sse sse4 c++23

2
推荐指数
1
解决办法
229
查看次数

C simd _m128 晶圆厂

如何为 __m128 向量制作 fabs() ?

我是否必须使用符号位将原始向量乘以 1.0f/-1.0f ?

没有找到任何指令集来做到这一点。

我不需要 __m256 或 512。我正在搜索 __m128 数据类型

c sse simd absolute-value

2
推荐指数
1
解决办法
87
查看次数

SSE2值提取问题

我想从128位寄存器中提取值(第一个字16bits),我得到了这个命令,但这不起作用.设置a的值后会有一些算术运算,比变量里面会有一些算术运算最后会改变我想要提取第一个字......我怎么能这样做...

int r;
int inm=0;

__m128i a=_mm_setr_epi16(8,9,3,2,4,5,6,11);

_asm{
    r = _mm_extract_epi16(a,inm);    
}
Run Code Online (Sandbox Code Playgroud)

c sse inline-assembly intrinsics

1
推荐指数
2
解决办法
717
查看次数

混淆XMM寄存器的位图

对不起我没有好头衔......

我正在读这个帖子: SSE中的矢量矩阵乘法

原始海报有以下代码

// xmm0 = (v0,v1,v2,v3)
movups xmm0, [eax]

// xmm0 = (v0,v0,v0,v0)
// xmm1 = (v1,v1,v1,v1)
// xmm2 = (v2,v2,v2,v2)
// xmm3 = (v3,v3,v3,v3)
shufps xmm3, xmm0, 255
shufps xmm2, xmm0, 170
shufps xmm1, xmm0, 85
shufps xmm0, xmm0, 0
Run Code Online (Sandbox Code Playgroud)

有人说以下:

但是根据手册真正发生了什么:(a,b,c,d)意味着a是0到31位,b是32到63位等等

// xmm0 = (v0,v1,v2,v3)
movups xmm0, [eax]

// xmm0 = (v0, v0, v0, v0)
shufps xmm0, xmm0, 0
Run Code Online (Sandbox Code Playgroud)

这对我来说很有意义,因为在线性数组模型中[elt0,elt1,elt2,....] elt0是Array [0].

令我困惑的是,根据手册,xmm寄存器的位图是[127 ... 0](见下图).

我就像看着位图的原始海报,并认为[elt0,elt2,elt3,elt4]的最左边是"11"位.

所以如果我想xmm0只包含v0

shufps xmm0, xmm0, 0xFF  // 11 11 11 11 …
Run Code Online (Sandbox Code Playgroud)

sse bitmap

1
推荐指数
1
解决办法
547
查看次数

_mm_packus_epi16饱和度问题

当我使用_mm_packus_epi16时,小于零的值将变为零,但高于127的数字将变为负值.

根据这个链接,它应该是无符号饱和度 http://msdn.microsoft.com/en-us/library/07ad1wx4%28v=vs.90%29.aspx

但没有发生

有什么建议?

码:

    __m128i result, resultHi, resultLo;
    //processing.....
    result = _mm_packus_epi16(resultLo, resultHi);
Run Code Online (Sandbox Code Playgroud)

c c++ x86 sse simd

1
推荐指数
1
解决办法
622
查看次数