问题标签 [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.

0 投票
1 回答
84 浏览

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

0 投票
2 回答
1899 浏览

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 也默认启用吗?

0 投票
1 回答
194 浏览

c - 使用 glibc 的 strlen()/strcmp() 或基于 SSE4.2 自行滚动是否有益?

根据“使用英特尔® 流式 SIMD 扩展 4(英特尔® SSE4)进行架构验证”(英特尔,2008 年),[他们] 添加了指令来帮助一次对两个 16 字节的操作数进行字符搜索和比较。我用 C 编写了一些基本的 strlen() 和 strcmp() 函数,但它们似乎比 glibc 慢。

我可能想尝试使用内联汇编来查看我的项目在输入/输出 XML 时的行为。

我已经读到(在此处),在 strlen() 之类的东西上使用 SMID 充满了潜在的问题(内存对齐),所以我有点担心在生产代码中使用它。

0 投票
3 回答
271 浏览

assembly - 如何在 sse2 上模拟 pcmpgtq?

PCMPGTQ 是在 sse4.2 中引入的,它为产生掩码的 64 位数字提供大于符号的比较。

在 sse4.2 之前的指令集上如何支持此功能?

更新:同样的问题适用于带有 Neon 的 ARMv7,它也缺少 64 位比较器。在这里可以找到与此相关的姊妹问题: 在 ARMv7a 与 Neon 上支持 CMGT 与 64 位签名比较的最有效方法是什么?

0 投票
2 回答
177 浏览

assembly - SSE4.1 无符号整数比较与溢出

_mm_add_epi16()考虑到 16 位无符号加法 ( ) 会溢出,有什么方法可以将 C >= (A + B) 与 SSE2/4.1 指令进行比较?

代码片段看起来像 -

问题是当 16 位加法溢出(回绕)时,大于比较会导致误报。我不能出于我的目的使用饱和添加。我在SSE2 整数溢出检查中查看了检测无符号加法溢出的机制。但是如果大于比较,我该如何使用。

0 投票
1 回答
114 浏览

c - 未定义的 intel_sse4_strlen

我遇到了一个问题。在我编译我的程序没有问题之后,我运行它并得到一个我无法弄清楚的错误: 在此处输入图像描述

我做了“nm -u 64rm | grep intel”并得到以下结果:

在此处输入图像描述

对于在 Text 部分中定义的这些 API,我该如何编译或应该做什么,如下所示: 在此处输入图像描述

谢谢您的帮助。

0 投票
1 回答
71 浏览

string - 使用 SSE4.2 或更早版本优化 find_first_not_of

我正在为协议编写文本数据包分析器,并在优化它时发现find_first_not_of调用是一个很大的瓶颈。

从本质上讲,如果一个数据包只包含有效字符,我需要查找它是否有效,这比默认的 C++ 函数要快。

例如,如果所有允许的字符都是f, h, o,tw, 在 C++ 中我只会调用s.find_first_not_of("fhotw"), 但在 SSEx 中我不知道在将字符串加载到一组__m128i变量中之后。

显然,_mm_cmpXstrY函数文档在这方面并没有真正帮助我。(例如_mm_cmpistri)。起初我可以减去_mm_sub_epi8,但我认为这不是一个好主意。

此外,我坚持使用 SSE(任何版本)。

0 投票
0 回答
86 浏览

c - 英特尔内部函数比较两个字符串

我正在尝试构建一个具有快速处理的标头解析器。我有两个问题,一个是下面的代码中有一个错误。

这就是我所拥有的,debug_print正在输出not_equal = 1

这是我的测试用例。

两个字符串都显示 not_equal 为 1。

0 投票
1 回答
76 浏览

assembly - 有没有办法将整数转换为字节,知道这些整数在字节范围内。使用 SSE?

在一个 xmm 寄存器中,我有 3 个值小于 256 的整数。我想将它们转换为字节,并将它们保存到内存中。我不知道如何处理它。
我正在考虑从中获取这些数字xmm1并将它们保存到eax,然后将最低字节移动到内存中,但我不确定如何从 xmm 寄存器中获取整数。我只能在第 0 个位置获取元素,但如何移动其余元素?
有一个完美的指令对我VPMOVDB有用,但我不能在我的处理器上使用它。有其他选择吗?

0 投票
1 回答
38 浏览

intrinsics - 为什么_mm_insert_ps的伪代码计算的是%8?

在 intel 内在函数指南中,_mm_insert_ps操作的伪代码定义如下:

. 进入imm8使我感到困惑:IF imm8[j%8]。在jrange 内0..3,模 8 部分似乎没有做任何事情。这是否可能表示我不知道的转换?或者%在这种情况下不是“模”?