问题标签 [simd]
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++ - c++ SSE SIMD框架
有人知道开源 C++ x86 SIMD 内部函数库吗?
英特尔在他们的集成性能原语库中提供了我所需要的东西,但由于版权无处不在,我不能使用它。
编辑
我已经知道编译器提供的内在函数。我需要的是一个方便的界面来使用它们。
gcc - gcc、simd 内在函数和快速数学概念
大家好:)
我正在尝试了解一些关于浮点、SIMD/数学内在函数和 gcc 的快速数学标志的概念。更具体地说,我在 x86 cpu 上使用 MinGW 和 gcc v4.5.0。
我已经搜索了一段时间,这就是我(认为我)目前所理解的:
当我在没有标志的情况下编译时,任何 fp 代码都将是标准的 x87,没有 simd 内在函数,并且 math.h 函数将从 msvcrt.dll 链接。
当我使用mfpmath、mssen和/或march以便启用 mmx/sse/avx 代码时,gcc只有在我还指定一些优化标志(如On或ftree-vectorize )时才实际使用 simd 指令。在这种情况下,内在函数由 gcc 自动选择,并且一些数学函数(我仍在谈论 math.h 上的标准数学函数)将成为内在函数或由内联代码优化,其他一些仍然来自 msvcrt。 dll。如果我不指定优化标志,这会改变吗?
当我使用特定的 simd 数据类型(可用作 gcc 扩展的那些,如v4si或v8qi)时,我可以选择直接调用内部函数,或者再次将自动决策留给 gcc。如果我没有通过正确的标志启用 simd 指令,Gcc 仍然可以选择标准 x87 代码。同样,如果我不指定优化标志,这会发生任何变化吗?
如果我的任何陈述有误,请纠正我:p
现在的问题:
- 我是否必须包含 x86intrin.h 才能使用内在函数?
- 我是否必须链接 libm?
- 快速数学与任何事情有什么关系?我知道它放宽了 IEEE 标准,但是,具体来说,如何?使用其他标准功能?链接了其他一些库?或者只是在某处设置了几个标志,标准库的行为不同?
感谢任何愿意提供帮助的人:D
c - 混合 SSE 整数/浮点 SIMD 指令时是否会降低性能
我最近经常以内部函数的形式使用 x86 SIMD 指令 (SSE1234)。我发现令人沮丧的是,SSE ISA 有几个简单的指令,它们仅适用于浮点数或整数,但理论上两者的性能应该相同。例如,浮点向量和双精度向量都有从地址(movhps,movhpd)加载 128 位向量的高 64 位的指令,但对于整数向量没有这样的指令。
我的问题:
在整数向量上使用浮点指令时,是否有任何理由预期性能会受到影响,例如使用movhps将数据加载到整数向量?
我写了几个测试来检查,但我认为他们的结果不可信。编写一个正确的测试来探索这些事情的所有极端情况真的很困难,尤其是当指令调度最有可能涉及到这里时。
相关问题:
其他琐碎相似的事情也有几条基本相同的指令。例如,我可以对por、orps或orpd进行按位或运算。谁能解释这些附加说明的目的是什么?我猜这可能与应用于每条指令的不同调度算法有关。
terminology - SPMD和SIMD有什么区别?
我只是无法理解他们之间的区别是什么......
SPMD 是在编程级别,而 SIMD 是在硬件级别吗?
例子会很好!
谢谢
c++ - 加速一些 SSE2 Intrinsics 以进行颜色转换
我正在尝试执行从 YCbCr 到 BGRA 的图像颜色转换(不要问 A 位,真让人头疼)。
无论如何,这需要尽可能快地执行,所以我使用编译器内在函数编写它以利用 SSE2。这是我第一次进入 SIMD 领域,我基本上是一个初学者,所以我确信我做的很多事情都是低效的。
我进行实际颜色转换的算术代码结果特别慢,英特尔的 VTune 将其显示为一个重要的瓶颈。
那么,有什么办法可以加快以下代码的速度?它以 32 位、一次 4 个像素完成。我最初尝试以 8 位,一次 16 个像素(如在上面的循环中),但计算导致整数溢出和转换中断。整个过程,包括英特尔 jpeg 解码,单个全高清场需要约 14 毫秒。如果我能把它降低到至少 12 毫秒,最好是 10 毫秒,那就太好了。
非常感谢任何帮助或提示。谢谢!
assembly - 帮我改进一些 SSE2 代码
我正在寻找一些帮助来改进 core2 cpus 上的这个双线性缩放 sse2 代码
在我的 Atom N270 和 i7 上,此代码比 mmx 代码快约 2 倍。但是在 core2 cpus 下它只等于 mmx 代码。
代码如下
c++ - 为什么 SSE set (_mm_set_ps) 会颠倒参数的顺序
我最近注意到
当转换为浮点数组时,将 4 个浮点数倒序排列:
同样的情况也发生在 a 上union { _m128 m; float[4] a; }
。
为什么 SSE 操作使用此排序?这没什么大不了的,但有点令人困惑。
还有一个后续问题:
通过索引访问数组中的元素时,应该按顺序访问0..3
还是按顺序访问3..0
?
cuda - CUDA 可以使用 SIMD 扩展吗?
我用谷歌搜索了一下,但现在我不清楚某些用 CUDA 编程的 GPU 是否可以利用或可以使用类似于 SSE SIMD 扩展的指令;例如,我们是否可以对两个浮点向量进行双精度求和,每个向量都有 4 个值。如果是这样,我想知道对于向量的前 4 个值中的每一个使用更轻的线程还是使用 SIMD 是否会更好。
c - sse simd 中的天花板/地板
谁能建议一种float
使用 SSE4.1 之前的 SIMD 计算地板/天花板的快速方法?我需要正确处理所有极端情况,例如当我有一个float
不能用 32 位 int 表示的值时。
目前我正在使用类似于以下代码(我使用 C 内在函数,为清楚起见转换为 asm):
有没有更有效的方法来检查浮点值是否对于 32 位 int 来说不是太大?
c - 使用 SSE 将向量乘以常数
我有一些在 4D 向量上运行的代码,我目前正在尝试将其转换为使用 SSE。我在 64b linux 上同时使用 clang 和 gcc。
仅对向量进行操作都可以很好地掌握。但是现在有一部分我必须将整个向量乘以一个常数 - 像这样:
像这样:
在哪里:
这当然行不通,因为我正在尝试对不兼容的数据类型进行乘法运算。
现在,我可以做类似的事情:
float4 a1 = (v4sf){25.0/216.0, 25.0/216.0, 25.0/216.0, 25.0/216.0}
但这只是让我觉得很傻,即使我写了一个宏来做到这一点。另外,我很确定这不会产生非常有效的代码。
谷歌搜索没有带来明确的答案(请参阅将常量浮点数加载到 SSE 寄存器中)。
那么将整个向量乘以相同常数的最佳方法是什么?