问题标签 [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 投票
3 回答
1584 浏览

sse - SIMD 编程

我正在使用 Core2Duo 处理器(编译器 gcc 4.4.1)中可用的 SSE 扩展。我看到有 16 个寄存器可用,每个寄存器都是 128 位长。现在,我可以在一个寄存器中容纳 4 个整数值,在另一个寄存器中容纳 4 个整数值,并且使用内在函数我可以将它们添加到一条指令中。明显的优势是这种方式我只需要 1 条指令而不是 4 条指令。

我的问题是“这就是 SIMD 的全部内容吗?”。让我有 a1、a2、a3、a4、a5、a6、a7、a8 和 b1、b2、b3、b4、b5、b6、b7、b8。令 A1、A2 为向量寄存器。现在,A1 <<< (a1, a2, a3, a4) 和 B1 <<< (b1, b2, b3, b4) 和 add (A1, B1) 将执行向量加法。

令 A2 <<< (a5, a6, a7, a8), B2 <<< (b5, b6, b7, b8)。是否有可以同时执行 add(A1, B1) 和 add(A2, B2) 的添加指令。

core2duo 中有多少向量功能单元可用,我在哪里可以获得这些信息?

高度赞赏与这些相关的任何其他信息来源。

0 投票
2 回答
1954 浏览

c++ - 使用 g++ 的 sse 内联汇编

我正在尝试 g++ 内联汇编和 sse 并编写了第一个程序。它出现段错误 - 为什么?

为什么 gdb 不允许我单步执行汇编指令?我需要在每一行周围写 asm ("..") 吗?

0 投票
2 回答
6428 浏览

gcc - Mac上的SSE4.1内在函数编译错误

我在(我认为)支持它的硬件上使用 SSE4.1 内在函数时遇到了一些麻烦。谁能告诉我我是否错过了什么?

在 MacBookPro5,4 (Penryn) 上构建以下代码:

生成以下错误:

0 投票
3 回答
3554 浏览

c - GCC 中用于除法的 SIMD (SSE) 指令

如果可能,我想使用 SSE 指令优化以下代码段:

这可能吗?

0 投票
8 回答
2830 浏览

c++ - SSE Stdlib 风格的图书馆?

一般来说,我在“网上”遇到的所有与 SSE/MMX 相关的东西都是作为向量和矩阵的数学东西出现的。但是,我正在寻找 SSE 优化的“标准函数”库,例如Agner Fog提供的库,或者 GCC 中一些基于 SSE 的字符串扫描算法。

作为一个快速的一般纲要:这些将是 memset、memcpy、strstr、memcmp BSR/BSF 之类的东西,即从 SSE 指令构建的 stdlib-esque

我希望它们使用内在函数而不是汇编用于 SSE1(正式 MMX2),但两者都可以。希望这不是太广泛的范围。

更新 1

经过一番搜索,我发现了一些有前途的东西,一个图书馆引起了我的注意:

  • LibFreeVec:似乎只有 mac/IBM(由于基于 AltiVec),因此用处不大(对我来说),而且我似乎找不到直接下载链接,也没有说明支持的最低 SSE 版本

我还看到了一篇关于一些向量化字符串函数(strlen、strstr strcmp)的文章。但是 SSE4.2 是我无法企及的(如前所述,我想坚持使用 SSE1/MMX)。

更新 2

Paul R 激励我做一些基准测试,不幸的是,由于我的 SSE 汇编编码经验接近 zip,我使用了别人的 ( http://www.mindcontrol.org/~hplus/ ) 基准代码并添加到它。所有测试(不包括原始版本,即 VC6 SP5)都在 VC9 SP1 下编译,并具有完整/自定义优化/arch:SSE等。

第一个测试是我的一台家用机器(AMD Sempron 2200+ 512mb DDR 333),上限为 SSE1(因此 MSVC memcpy 没有矢量化):

完整的测试

第二批测试是在大学工作站上完成的(Intel E6550、2.33Ghz、2gb DDR2 800?)

完整的测试

可以看出,SSE 在我的家庭系统上非常快,但落在 intel 机器上(可能是由于编码错误?)。我的 x86 汇编变体在我的家用机器上排在第二位,在英特尔系统上排在第二位(但结果看起来有点不一致,一个拥抱块它主导了 SSE1 版本)。MSVC memcpy 赢得了英特尔系统测试的胜利,这是由于 SSE2 矢量化,但在我的家用机器上,它惨遭失败,即使是可怕的__movsd击败它......

陷阱:内存是 2 的所有对齐幂。缓存(希望)被刷新。rdtsc 用于计时。

兴趣点:MSVC 有一个(未在任何参考中列出)__movsd内在函数,它输出与我正在使用的相同的汇编代码,但它失败得很惨(即使是内联的!)。这可能就是它未上市的原因。

VC9 memcpy 可以在我的非 sse 2 机器上强制向量化,但是它会破坏 FPU 堆栈,它似乎也有一个错误。

这是我用来测试的全部来源(包括我的改动,再次感谢http://www.mindcontrol.org/~hplus/的原始版本)。项目文件的二进制文件可应要求提供。

总之,似乎一个切换变体可能是最好的,类似于 MSVC crt 一个,只有更多的选项和单一的一次性检查(通过内联函数指针?或者像内部直接调用这样更狡猾的东西)更加坚固补丁),但是内联可能不得不使用最佳案例方法

更新 3

Eshan 提出的一个问题提醒了一些有用的和与此相关的东西,虽然BitMagic仅适用于位集和位操作,但对大型位集非常有用,它甚至还有一篇关于SSE2(位)优化的好文章。不幸的是,这仍然不是 CRT/stdlib esque 类型库。似乎这些项目中的大多数都致力于特定的一小部分(问题)。

这就提出了一个问题,是否值得创建一个开源的、可能是多平台性能的 crt/stdlib 项目,创建各种版本的标准化函数,每个版本都针对特定情况进行了优化,以及“最佳情况” '/该函数的通用变体,具有标量/MMX/SSE/SSE2+(à la MSVC)的运行时分支或强制编译时标量/SIMD 开关。

这对于 HPC 或每一点性能都很重要的项目(如游戏)很有用,使程序员不必担心内置函数的速度,只需进行少量调整即可找到最佳优化变体。

更新 4

我认为应该扩展这个问题的性质,包括可以使用 SSE/MMX 来优化非向量/矩阵应用程序的技术,这也可能用于 32/64 位标量代码。一个很好的例子是如何使用标量技术(位操作)、MMX 和 SSE/SIMD 立即检查给定的 32/64/128/256 位数据类型中是否出现字节

另外,我看到很多“只使用 ICC”的答案,这是一个很好的答案,这不是我的答案,因为首先,ICC 不是我可以持续使用的东西(除非英特尔有免费的学生版对于windows),由于 30 试用。其次,更重要的是,我不仅关注库本身,还关注用于优化/创建它们包含的功能的技术,以供我个人改进和改进,因此我可以将这些技术和原则应用于我自己的代码(如果需要),结合使用这些库。希望这可以清除那部分:)

0 投票
1 回答
528 浏览

c - 旧版本 GCC 上的 DPPS

嘿!

我需要在 c 中优化一些矩阵乘法代码,并且我正在使用 SSE 向量指令进行操作。我还发现存在 SSE4.1 已经有针对点积 dpps 的指令。

问题是在这个软件应该工作的机器上安装了一个旧版本的 gcc (4.1.2),它不支持 SSE4.1,但它有一个支持它的处理器(不要问我为什么gcc 版本比处理器旧...)。所以我不能使用 _mm_dp_ps 函数。

我正在尝试向 c 添加一些汇编代码。问题是我以前从未使用过汇编代码,所以真的很混乱。在汇编程序中编写所有处理向量指令的代码是否更有效?

所以我在这里问是否还有其他方法可以使用 dpps 指令,是否值得使用?

0 投票
4 回答
2333 浏览

c - 如何使用 SSE 内在函数将值存储在不连续的内存位置?

我对 SSE 很陌生,并且使用内在函数优化了一段代码。我对操作本身很满意,但我正在寻找一种更好的方法来编写结果。结果以三个_m128i变量结束。

我想要做的是将结果值中的特定字节存储到非连续的内存位置。我目前正在这样做:

其中ycbcr是字节 ( unsigned char) 数组。由于我无法定义的原因,这对我来说似乎是错误的。有人对更好的方法有任何建议吗?

谢谢!

0 投票
3 回答
792 浏览

f# - F# 中的 SSE3 指令

如何使用 SSE3 指令集并行化我的 F# 程序?F# 编译器是否支持它?

0 投票
3 回答
4177 浏览

c++ - 我的编译器在做什么?(优化memcpy)

我正在使用 VC++2010 中的以下设置编译一些代码: /O2 /Ob2 /Oi /Ot

但是我在理解生成的程序集的某些部分时遇到了一些麻烦,我在代码中提出了一些问题作为注释。

另外,现代cpus一般推荐什么预取距离?我可以在我自己的 cpu 上进行测试,但我希望有一些值可以在更广泛的 cpu 上运行良好。也许可以使用动态预取距离?

<--编辑:

我感到惊讶的另一件事是编译器不会以某种形式交错 movdqa 和 movntdq 指令?因为这些指令在某种意义上与我的理解是异步的。

这段代码在预取时也假设有 32 字节的缓存线,但是似乎高端 cpu 有 64 字节的缓存线,所以可能会删除 2 个预取。

-->

原始代码:

0 投票
4 回答
1196 浏览

algorithm - SIMD 优化难题

我想使用 SIMD(SSE2 等)优化以下功能:

这似乎是一个非常可矢量化的任务,除了所需的指令不存在......

我们可以假设 N 非常大(10^12 到 10^18)并且 size~sqrt(N)。我们还可以假设 p 只能取 -1、0 和 1 的值;所以我们不需要真正的乘法,(N/i)*p[i] 可以用四个指令(pcmpgt、pxor、psub、pand)来完成,如果我们能以某种方式计算 N/i。