问题标签 [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.
assembly - 什么是开始学习组装的好地方?
我需要使用 SSE 指令学习汇编,并且需要 gcc 将 ASM 代码与 c 代码链接。
我不知道从哪里开始,谷歌也没有帮助。
performance - 为什么 SSE scalar sqrt(x) 比 rsqrt(x) * x 慢?
我一直在分析我们在英特尔酷睿双核上的一些核心数学,在研究平方根的各种方法时,我注意到了一些奇怪的事情:使用 SSE 标量运算,取倒数平方根并将其相乘会更快获得 sqrt,而不是使用本机 sqrt 操作码!
我正在使用类似以下的循环对其进行测试:
我已经为 TestSqrtFunction 尝试了几个不同的主体,我有一些时间真的让我摸不着头脑。到目前为止,最糟糕的是使用本机 sqrt() 函数并让“智能”编译器“优化”。在 24ns/float 时,使用 x87 FPU 这非常糟糕:
我尝试的下一件事是使用内在函数强制编译器使用 SSE 的标量 sqrt 操作码:
这更好,为 11.9ns/float。我还尝试了Carmack 古怪的 Newton-Raphson 近似技术,它比硬件运行得更好,为 4.3ns/float,尽管误差为 2 10分之 1 (这对我的目的来说太多了)。
当我尝试使用 SSE 运算求平方根的倒数,然后使用乘法得到平方根时( x * 1/√x = √x ),这很糟糕。尽管这需要两个相关的操作,但它是迄今为止最快的解决方案,在 1.24ns/float 和精确到 2 -14:
我的问题基本上是什么给了?为什么 SSE 的内置硬件平方根操作码比从其他两个数学运算中合成它要慢?
我确信这确实是操作本身的成本,因为我已经验证:
- 所有数据都适合缓存,并且访问是顺序的
- 函数是内联的
- 展开循环没有区别
- 编译器标志设置为完全优化(我检查过,程序集很好)
(编辑:stephentyrone 正确地指出,对长字符串的操作应该使用矢量化 SIMD 打包操作,例如rsqrtps
——但这里的数组数据结构仅用于测试目的:我真正想要测量的是代码中使用的标量性能不能向量化。)
c - SSE 寄存器返回,SSE 禁用
我处于以下情况:
- 我正在为不允许 SSE 指令的内核编写代码
- 我需要做浮点运算
- 我正在为 x86_64 平台编译
这是一个说明问题的代码示例:
这是makefile中的相关行:
当我运行构建时,出现此错误:
(错误指向将 d 和 base_value 相乘的行)
知道我能做些什么来解决这个问题吗?删除 -mno-sse 不是一个选项,但似乎编译器应该能够生成非 sse 代码来进行乘法运算。
谢谢内森
java - 数值算法中的 Java 性能
我对 Java 数值算法的性能很好奇,例如矩阵矩阵双精度乘法,使用最新的 JIT 机器,例如与手动调整的 SSE C++/汇编器或 Fortran 对应物相比。
我在网上看过,但大部分结果来自近 10 年前,我知道 Java 从那时起取得了很大进步。
如果您有使用 Java 进行数字密集型应用程序的经验,您可以分享您的经验。此外,Java 在循环相对较短且内存访问不是很均匀但仍在 L1 缓存范围内的内核中表现如何?如果这样的内核连续执行多次,JVM可以在运行时对其进行优化吗?
谢谢
sse - SSE2:如何将 _m128 简化为一个单词
将 _m128 (4 个单词 abcd)减少为一个单词的最佳方法( sse2 )是什么?我想要每个 _m128 组件的低部分:
有没有内在函数?谢谢 !
gcc - 基准 SSE 指令
我正在对一些SSE代码(将 4 个浮点数乘以 4 个浮点数)与做同样事情的传统 C 代码进行基准测试。我认为我的基准代码在某种程度上一定是不正确的,因为它似乎说非 SSE 代码比 SSE 快 2-3 倍。
有人可以告诉我下面的基准测试代码有什么问题吗?也许建议另一种方法来准确显示 SSE 和非 SSE 代码的速度。
gcc - C - 如何使用 GCC SSE 向量扩展访问向量的元素
通常我使用以下类型处理 3D 矢量:
使用 smth. 初始化向量。像:
并使用 smth 访问它们。像:
现在我需要一个使用 SSE 指令的向量算术。我有以下代码:
GCC 支持这种方式。但是......首先,它给了我 0.00000 作为结果。其次,我无法访问此类向量的元素。我的问题是:如何访问此类向量的元素?我需要smth。比如 a[0] 访问 X 元素, a[1] 访问 Y 元素等。
PS:我使用以下代码编译此代码:
gcc - 使用 SSE 指令进行快速图像处理?
我正在用 C 编写一个图形库,我想利用 SSE 指令来加速某些功能。我该怎么做呢?我正在使用 GCC 编译器,因此我可以依赖编译器内在函数。我还想知道是否应该更改存储图像数据的方式(目前我只是使用浮点数组)-我需要使用类型数组float __attribute__ ((vector_size (16)))
吗?
编辑:我感兴趣的图像处理/处理类型包括仿射变换、几何和频域滤波(傅立叶分析)
任何关于我应该如何在 C 中使用 SSE 进行图像处理的参考或提示将不胜感激。
谢谢
x86 - x87 相对于 SSE 的优势
我知道 x87 具有更高的内部精度,这可能是人们看到的它与 SSE 操作之间的最大区别。但我不得不怀疑,使用 x87 还有其他好处吗?我有-mfpmath=sse
在任何项目中自动输入的习惯,我想知道我是否遗漏了 x87 FPU 提供的任何其他内容。
c - 如何判断内存是否对齐?
我是使用 SSE/SSE2 指令优化代码的新手,直到现在我还没有走得太远。据我所知,一个常见的 SSE 优化函数如下所示:
但是,我如何正确确定内存ptr
指向的位置是否按例如 16 字节对齐?我认为我必须包含非对齐内存的常规 C 代码路径,因为我无法确保传递给此函数的每个内存都将对齐。并且使用内在函数将数据从未对齐的内存加载到 SSE 寄存器似乎非常慢(甚至比常规 C 代码慢)。
先感谢您...