问题标签 [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.
c++ - 使用 SSE 在 __m128i 向量中获取最小短值?
这个问题似乎类似于Getting max value in a __m128i vector with SSE? 但有短裤和最小值而不是整数+最大值。这就是我想出的:
该函数与https://stackoverflow.com/a/18616825/1500111中x的上下部分的答案基本相同。所以,我知道最小值在 __m128i 变量 max2 的位置 0 或 4 中。虽然它比下面显示的无 SIMD 功能快得多 horizontal_min_Vec4i_Plain(__m128i x)
,但恐怕瓶颈是_mm_extract_epi16 operation
最后一行。有没有更好的方法来实现这一点,以获得更好的速度?我正在使用 Haswell,因此我可以访问最新的 SSE 扩展。
c - 最佳 SSE 无符号 8 位比较
我试图找到使用 SSE(最高 SSE 4.2)执行 8 位无符号比较的最佳方法。
我正在处理的最常见情况是比较> 0U,例如
(当然也可以认为是对非零的简单测试。)
但我也对更一般的情况有些感兴趣,例如
第一种情况可以用 2 条指令实现,使用各种不同的方法,例如与 0 比较然后反转结果。第二种情况通常需要 3 条指令,例如从两个操作数中减去 128 并执行有符号比较。(有关各种 3 种指令解决方案,请参阅此问题。)
理想情况下,我正在寻找#1 的单指令解决方案和#2 的双指令解决方案。如果这些都不可能,那么我也对各种可能的 2 或 3 指令实现中的哪一个在现代 Intel CPU(Sandy Bridge、Ivy Bridge、Haswell)上最有效的想法感兴趣。
迄今为止案例 #2 的最佳实现:
- 与无符号最大值比较等于并反转结果:
#define _mm_cmpgt_epu8(v0, v1) \ _mm_andnot_si128(_mm_cmpeq_epi8(_mm_max_epu8(v0, v1), v1), \ _mm_set1_epi8(-1))
两条算术指令 + 一条按位 = 1.33 吞吐量。
- 反转两个参数的符号位(== 减 128)并使用有符号比较:
#define _mm_cmpgt_epu8(v0, v1) \ _mm_cmpgt_epi8(_mm_xor_si128(v0, _mm_set1_epi8(-128)), \ _mm_xor_si128(v1, _mm_set1_epi8(-128)))
一条算术指令 + 两条按位 = 1.16 吞吐量。
案例 #1 的最佳实现,源自上面的案例 #2 实现:
- 1.
#define _mm_cmpgtz_epu8(v0) \ _mm_andnot_si128(_mm_cmpeq_epi8(v0, _mm_set1_epi8(0)), \ _mm_set1_epi8(-1))
一条算术指令 + 一条按位 = 0.83 吞吐量。
- 2.
#define _mm_cmpgtz_epu8(v0) \ _mm_cmpgt_epi8(_mm_xor_si128(v0, _mm_set1_epi8(-128)), \ _mm_set1_epi8(-128)))
一条算术指令 + 一条按位 = 0.83 吞吐量。
c - _mm_testc_ps 和 _mm_testc_pd 与 _mm_testc_si128
如您所知,前两个是特定于 AVX 的内在函数,第二个是 SSE4.1 内在函数。两组内在函数都可用于检查 2 个浮点向量是否相等。我的具体用例是:
_mm_cmpeq_ps
或_mm_cmpeq_pd
, 后跟_mm_testc_ps
或_mm_testc_pd
在结果上,使用适当的掩码
但是 AVX 提供了“遗留”内在函数的等价物,所以我可以在_mm_testc_si128
将结果转换为__m128i
. 我的问题是,这两个用例中的哪一个会带来更好的性能,以及我在哪里可以找到 AVX 提供了哪些旧版 SSE 指令。
assembly - 如何将内存中的 96 位加载到 XMM 寄存器中?
假设我有一个指向内存的指针rsi
,我想将指向的 12 字节值加载到xmm0
. 我不在乎高 32 位会发生什么。有什么有效的方法来做到这一点?
(附带的问题:我想出的最好的方法涉及movlpd
“移动低压缩双精度浮点值”指令。有没有什么方法可以使该指令特定于浮点值?我不明白什么它是以这种方式记录的;当然它也应该适用于整数。)
assembly - SSE:如何将每个打包字节的符号位提取到打包寄存器中?
给定 中的压缩字节xmm0
,将每个字节的符号(即最高阶)位提取到 中的有效方法是什么xmm1
?换句话说,我想AND
为每个打包字节计算 0x80 的逻辑。
例如:
x86 - AVX 或 AVX2 是否支持 256 位字符串指令和 mullo for unsigned short?
我研究了 ISA 支持的字符串指令,AVX
但AVX2
我找不到任何 256 位字符串比较指令,例如SSE4.2
如果有任何字符串比较我找不到我在哪里可以找到它们?否则为什么 AVX/AVX2 ISA 不支持 256 位字符串指令?我还发现 AVX2 不支持mullo
16unsigned short
位无符号整数,我不知道原因。因为它已经在SSE4.2
.
c - Knights Landing CPU (Xeon Phi) 会加速字节/字整数代码吗?
Intel Xeon Phi "Knights Landing" 处理器将是第一个支持 AVX-512 的处理器,但它只支持 "F"(比如没有 SSE2 的 SSE,或者没有 AVX2 的 AVX),所以主要是浮点数。
我正在编写通过内部函数使用高达 SSE4.1 指令对字节和字(8 位和 16 位)进行操作的软件。
我很困惑在 AVX-512F 中是否会有所有/大多数 SSE4.1 指令的 EVEX 编码版本,这是否意味着我可以期望我的 SSE 代码自动获得 EVEX 扩展指令并映射到所有新寄存器。
维基百科是这样说的:
SIMD寄存器文件的宽度从256位增加到512位,共有32个寄存器ZMM0-ZMM31。这些寄存器可以作为来自 AVX 扩展的 256 位 YMM 寄存器和来自 Streaming SIMD 扩展的 128 位 XMM 寄存器进行寻址,并且在使用 EVEX 时,可以扩展传统的 AVX 和 SSE 指令以对 16 个额外的寄存器 XMM16-XMM31 和 YMM16-YMM31 进行操作编码形式。
不幸的是,这并没有说明在启用 AVX512 的情况下编译 SSE4 代码是否会导致与将其编译为 AVX2 提供的相同(令人敬畏的)加速(遗留指令的 VEX 编码)。
有人知道为 AVX-512F 编译 SSE2/4 代码(C 内在函数)时会发生什么吗?可以期待像 AVX1 的字节和字指令的 VEX 编码那样的减速带吗?
assembly - 如何将字节复制到 xmm0 寄存器中
我有以下代码可以正常工作,但考虑到最终结果只需要 xmm0 中的数据,它似乎效率低下
我确定使用 SSE2、SSE4 等,有一种更好的方法不需要使用 CMD 缓冲区,但我正在努力解决如何做到这一点。
assembly - 可以跳过每第二个字节的 SSE mov 指令?
我需要将所有奇数字节从一个内存位置复制到另一个内存位置。即复制第一个、第三个、第五个等。具体来说,我从包含 2000 个字符/属性词的文本区域 0xB8000 复制。我想跳过属性字节并以字符结尾。以下代码工作正常:
要复制的数字或字符介于 1 到 2000 之间。我最近开始玩 sse2、sse3 sse4.2 但找不到可以减少循环的指令。理想情况下,我希望将循环从 2000 减少到 250,如果有一条指令可以在一次加载 128 位后跳过每 2 个字节,这将是可能的。
c++ - 使用带有小图案的 SSE4.2 指令 PCMPESTRM
我试图在字符串匹配算法中使用一些 SSE4.2 指令,用 C++ 编码。
我不明白如何使用这些指令来匹配较小的模式,并希望有人能帮助我解决这个问题。
在代码示例中,我试图在打包字符串“i am an antelope”中找到模式“ant”。我希望结果是一个掩码设置为除索引 8 处的 1 之外的所有零。
这是我现在的代码,其中 #include for nmmintrin.h 包含 sse4.2 指令:
我添加了所有的零,因为初始化函数不允许更少的参数。我意识到这是错误的,但不知道该怎么做,做了几次非常绝望的尝试。
无论如何,这就是我编译的方式: g++ -g sse4test.cpp -o sse4test -std=c++11 -msse4.2
这是我的输出:
我不明白,真的。(最后一行)。
任何帮助将不胜感激。