问题标签 [sse]

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 投票
5 回答
6785 浏览

c - 测试双数是否为整数的最快方法是什么(在现代英特尔 X86 处理器中)

我们的服务器应用程序在热代码路径中进行了大量的整数测试,目前我们使用以下函数:

这个功能在我们的工作量中非常热门,所以我希望它尽可能快。如果可以的话,我还想消除“地板”库调用。有什么建议么?

0 投票
3 回答
9839 浏览

c - 如何使用 128 位 C 变量和 xmm 128 位 asm?

在 gcc 中,我想通过 asm 代码对 2 个 C 变量进行 128 位 xor:如何?

但我有一个分段错误错误;这是 objdump 输出:

0 投票
3 回答
3205 浏览

c++ - VC++ SSE 内在优化怪异

我正在从文件中执行 8 位数据的分散读取(De-Interleaving a 64 channel wave file)。然后我将它们组合成一个字节流。我遇到的问题是我重新构建要写出的数据。

基本上我正在读取 16 个字节,然后将它们构建到单个 __m128i 变量中,然后使用 _mm_stream_ps 将值写回内存。但是我有一些奇怪的性能结果。

在我的第一个方案中,我使用 _mm_set_epi8 内在函数来设置我的 __m128i,如下所示:

基本上我让编译器决定如何优化它以提供最佳性能。这给出了最差的性能。我的测试在 ~0.195 秒内运行。

其次,我尝试使用 4 _mm_set_epi32 指令进行合并,然后将它们打包:

这确实在一定程度上提高了性能。我的测试现在在 ~0.15 秒内运行。这样做似乎违反直觉,因为我认为这正是 _mm_set_epi8 正在做的事情......

我最后的尝试是使用一些代码,我用老式的方式制作四个 CC(使用 shift 和 ors),然后使用单个 _mm_set_epi32 将它们放入 __m128i 中。

这提供了更好的性能。运行我的测试大约需要 0.135 秒。我真的开始迷茫了。

所以我尝试了一个简单的读字节写字节系统,它甚至比最后一种方法快得多。

那么发生了什么?这一切对我来说似乎违反直觉。

我已经考虑过延迟发生在 _mm_stream_ps 上的想法,因为我提供数据的速度太快了,但是无论我做什么,我都会得到完全相同的结果。前两种方法是否可能意味着 16 个负载无法通过循环分配以隐藏延迟?如果是这样,为什么会这样?当然,内在函数允许编译器随心所欲地进行优化..我认为这就是重点......而且执行 16 次读取和 16 次写入肯定会比使用一堆 SSE 杂耍的 16 次读取和 1 次写入慢得多说明......毕竟它的读写速度很慢!

任何有任何想法的人都将不胜感激!:D

编辑:在下面的评论之后,我停止将字节预加载为常量并将其更改为:

这将性能提高到 ~0.143 秒。Sitll 不如直接的 C 实现...

再次编辑:迄今为止我得到的最佳表现是

这使我可以在 ~0.095 秒内进行处理,这要好得多。不过,我似乎无法与 SSE 接近……我仍然对此感到困惑,但是……哼哼。

0 投票
3 回答
6546 浏览

c++ - 如何使用来自另一个 XMM 寄存器条目的 4 个相同浮点数填充 x86 XMM 寄存器?

我正在尝试实现一些内联汇编器(在 C/C++ 代码中)以利用 SSE。我想将值(从 XMM 寄存器或内存)复制并复制到另一个 XMM 寄存器。例如,假设我在内存中有一些值 {1, 2, 3, 4}。我想复制这些值,使 xmm1 填充 {1, 1, 1, 1},xmm2 填充 {2, 2, 2, 2},依此类推。

查看英特尔参考手册,我找不到执行此操作的说明。我是否只需要结合使用重复的 MOVSS 和旋转(通过 PSHUFD?)?

0 投票
2 回答
2701 浏览

arm - 常见的 SIMD 技术

我在哪里可以找到有关常见 SIMD 技巧的信息?我有一个指令集,并且知道如何编写简单的 SIMD 代码,但我知道,现在的 SIMD 功能要强大得多。它可以保存复杂的条件无分支代码。
例如 ( ARMv6),以下指令序列将 Rd 的每个字节设置为等于 Ra 和 Rb 的相应字节的无符号最小值:

教程链接/不常见的 SIMD 技术也很好 :) ARMv6对我来说是最有趣的,但是x86(SSE,...)/ Neon(在 ARMv7 中)/其他也很好。

0 投票
1 回答
2811 浏览

gcc - GCC 扩展 ASM 语法:加载 128 位内存位置作为源

GCC 为下面的 shuffle() 生成此代码:

理想情况下,这应该是:

生成这条指令的扩展 ASM 语法是什么?

非常感谢,亚当

PS:注释掉的内在函数为这个例子生成了最佳代码。这通常不起作用(GCC 可能会在存在全局寄存器变量的情况下生成不必要的寄存器副本)。

$ gcc -Os -std=gnu99 -msse4.1 -flax-vector-conversions pshufb_128bit_constant.c && objdump -d -m i386:x86-64:intel a.out |less

0 投票
2 回答
3549 浏览

assembly - 将两个 x86 32 位寄存器存储到 128 位 xmm 寄存器中

有没有更快的方法将两个 x86 32 位寄存器存储在一个 128 位 xmm 寄存器中?

因此,如果 EAX 为0x12345678且 EDX 为0x87654321,则 xmm0 中的结果必须为0x8765432112345678

0 投票
5 回答
1184 浏览

x86 - 是否可以矢量化 myNum += a[b[i]] * c[i]; 在 x86_64 上?

我将使用什么内在函数在 x86_64 上对以下内容进行矢量化(如果甚至可以矢量化)?

0 投票
2 回答
6049 浏览

qt - Qt、GCC、SSE 和堆栈对齐

我正在尝试制作一个使用 GCC 编译并使用 Qt 和 SSE 内在函数的程序。似乎当我的一个函数被 Qt 调用时,堆栈对齐不会被保留。这是一个简短的例子来说明我的意思:

这是输出:

配置:

  • 英特尔酷睿2
  • 操作系统,SP3
  • GCC 4.4(Mingw 包含在 Qt SDK 2010.01 中)

我尝试使用与我在 Qt makefile 中看到的相同的选项来编译示例程序:

,链接选项:

现在我不知道在哪个方向搜索。任何提示将不胜感激。谢谢!

法比安

0 投票
2 回答
1077 浏览

assembly - 在 SSE 中组合前缀

在 SSE 中,前缀066h(操作数大小覆盖)0F2H(REPNE)和0F3h(REPE)是操作码的一部分。

在非 SSE066h中,在 32 位(或 64 位)和 16 位操作之间切换。 0F2h0F3h用于字符串操作。它们可以组合在一起,以便066h0F2h(或0F3h)可以在同一条指令中使用,因为这是有意义的。SSE 指令中的行为是什么?例如,我们有(暂时忽略 mod/rm):

但这是什么?

怎么样?

更不用说以下有两个冲突的 REP 前缀:

这些的规格是什么?