问题标签 [sse4]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - 将数据从内存(可以是任意长度)移动到 XMM
我对汇编(NASM)知之甚少,我想使用 SSE4.2 执行字符串操作(是否存在子字符串)。所以我了解了 PCMPESTRI、PCMPISTRM 的工作原理。我被困在中间,即从内存到 xmm 寄存器的数据传输。基本上,我想通过命令行获取输入(例如:./a.out ABCD)并传输到 xmm1 寄存器。通过命令行获取输入可以是任意长度的字符串,即(1 - 大于 16),命令行数据存储后附加 0(即 ABCD\0),我们得到它的起始地址,该地址存在于堆栈中。那么如何使命令行数据对齐到 16 个字节(ABCD\0\0\0\0... 最多 16 个)?
另外我不想使用 brk 系统调用分配内存并将所有命令行数据复制到它,然后传输到 xmm1 寄存器。(因为我想一次性实现子字符串检查,而不是将所有数据移动到新分配的内存然后复制每个内容....这可能会增加执行时间)
我试图这样做: -
但它没有用.. 那么我如何通过考虑输入来实现将数据传输到 xmm 寄存器的长度可变(1 - 超过 16)
我应该使用哪个移动指令?
我应该如何解决这种数据移动,其中输入将来自命令行并且它可以是任何长度..?
我的 CPU 信息标志(/proc/cpuinfo)是:sse sse2 ssse2 sse4_1 sse4_2
visual-c++ - 如何在 MSVC 中启用 SSE4.1 和 SSE3(但不是 AVX)
我正在尝试使用 MSVC 启用不同的 simd 支持。
有一个页面谈论启用一些 simd,例如 SSE2、AVX、AVX2 https://docs.microsoft.com/en-us/cpp/build/reference/arch-x86?redirectedfrom=MSDN &view=vs- 2019
但是,它没有提到如何启用其他 simd 优化,例如 SSE4.1、SSE4.2、SSE3 是否可以在不启用 AVX 的情况下启用这些优化?
另外,看起来在 MSVC2017 /arch:SSE2 不再支持/需要,我可以假设 SSE3/SSE4.1/SSE4.2 也默认启用吗?
c - 使用 glibc 的 strlen()/strcmp() 或基于 SSE4.2 自行滚动是否有益?
根据“使用英特尔® 流式 SIMD 扩展 4(英特尔® SSE4)进行架构验证”(英特尔,2008 年),[他们] 添加了指令来帮助一次对两个 16 字节的操作数进行字符搜索和比较。我用 C 编写了一些基本的 strlen() 和 strcmp() 函数,但它们似乎比 glibc 慢。
我可能想尝试使用内联汇编来查看我的项目在输入/输出 XML 时的行为。
我已经读到(在此处),在 strlen() 之类的东西上使用 SMID 充满了潜在的问题(内存对齐),所以我有点担心在生产代码中使用它。
assembly - 如何在 sse2 上模拟 pcmpgtq?
PCMPGTQ 是在 sse4.2 中引入的,它为产生掩码的 64 位数字提供大于符号的比较。
在 sse4.2 之前的指令集上如何支持此功能?
更新:同样的问题适用于带有 Neon 的 ARMv7,它也缺少 64 位比较器。在这里可以找到与此相关的姊妹问题: 在 ARMv7a 与 Neon 上支持 CMGT 与 64 位签名比较的最有效方法是什么?
assembly - SSE4.1 无符号整数比较与溢出
_mm_add_epi16()
考虑到 16 位无符号加法 ( ) 会溢出,有什么方法可以将 C >= (A + B) 与 SSE2/4.1 指令进行比较?
代码片段看起来像 -
问题是当 16 位加法溢出(回绕)时,大于比较会导致误报。我不能出于我的目的使用饱和添加。我在SSE2 整数溢出检查中查看了检测无符号加法溢出的机制。但是如果大于比较,我该如何使用。
string - 使用 SSE4.2 或更早版本优化 find_first_not_of
我正在为协议编写文本数据包分析器,并在优化它时发现find_first_not_of
调用是一个很大的瓶颈。
从本质上讲,如果一个数据包只包含有效字符,我需要查找它是否有效,这比默认的 C++ 函数要快。
例如,如果所有允许的字符都是f
, h
, o
,t
和w
, 在 C++ 中我只会调用s.find_first_not_of("fhotw")
, 但在 SSEx 中我不知道在将字符串加载到一组__m128i
变量中之后。
显然,_mm_cmpXstrY
函数文档在这方面并没有真正帮助我。(例如_mm_cmpistri
)。起初我可以减去_mm_sub_epi8
,但我认为这不是一个好主意。
此外,我坚持使用 SSE(任何版本)。
c - 英特尔内部函数比较两个字符串
我正在尝试构建一个具有快速处理的标头解析器。我有两个问题,一个是下面的代码中有一个错误。
这就是我所拥有的,debug_print
正在输出not_equal = 1
。
这是我的测试用例。
两个字符串都显示 not_equal 为 1。
assembly - 有没有办法将整数转换为字节,知道这些整数在字节范围内。使用 SSE?
在一个 xmm 寄存器中,我有 3 个值小于 256 的整数。我想将它们转换为字节,并将它们保存到内存中。我不知道如何处理它。
我正在考虑从中获取这些数字xmm1
并将它们保存到eax
,然后将最低字节移动到内存中,但我不确定如何从 xmm 寄存器中获取整数。我只能在第 0 个位置获取元素,但如何移动其余元素?
有一个完美的指令对我VPMOVDB
有用,但我不能在我的处理器上使用它。有其他选择吗?
intrinsics - 为什么_mm_insert_ps的伪代码计算的是%8?
在 intel 内在函数指南中,_mm_insert_ps操作的伪代码定义如下:
. 进入imm8
使我感到困惑:IF imm8[j%8]
。在j
range 内0..3
,模 8 部分似乎没有做任何事情。这是否可能表示我不知道的转换?或者%
在这种情况下不是“模”?