问题标签 [sse2]
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/SSE2 指令的打包和解包数据?
我正在尝试了解有关 SSE/SSE2 如何工作的更多信息:我知道 SSE/SSE2 使用大小为 128 位(16 字节)的 mmx 寄存器,并且通常这些寄存器有 4 个浮点单元格,我可以通过打包来存储我的浮点数. 在得到结果之前,我应该“解压它们”。
我的问题是:既然我是菜鸟,为什么要将这些值打包到 xmm 寄存器中,为什么要解压缩它们?这有什么好处?
c++ - SQRT vs RSQRT vs SSE _mm_rsqrt_ps 基准
我还没有找到任何关于这个主题的明确基准,所以我做了一个。我会把它贴在这里,以防有人像我一样寻找这个。
我有一个问题。SSE 不应该比循环中的四个 fpu RSQRT 快 4 倍吗?它更快,但只有 1.5 倍。迁移到 SSE 寄存器是否会产生如此大的影响,因为我不进行大量计算,而只进行 rsqrt?还是因为 SSE rsqrt 更精确,我如何找到 sse rsqrt 的迭代次数?两个结果:
编辑
/GS- /Gy /fp:fast /arch:SSE2 /Ox /Oy- /GL /Oi
在 AMD Athlon II X2 270 上使用 MSVC 11 编译
测试代码:
使用浮点类型的结果:
我的结论是,除非我们对不少于 4 个变量进行计算,否则不值得为 SSE2 烦恼。(也许这仅适用于 rsqrt 这里但它是一个昂贵的计算(它还包括多个乘法)所以它可能也适用于其他计算)
同样 sqrt(x) 比两次迭代的 x*rsqrt(x) 更快,而一次迭代的 x*rsqrt(x) 对于距离计算来说太不准确了。
所以我在一些板上看到的关于 x*rsqrt(x) 比 sqrt(x) 快的陈述是错误的。因此,除非您直接需要 1/x^(1/2),否则使用 rsqrt 代替 sqrt 是不合逻辑的,也不值得损失精度。
尝试不使用 SSE2 标志(如果它在正常 rsqrt 循环上应用 SSE,它会给出相同的结果)。
我的 RSQRT 是 quake rsqrt 的修改(相同)版本。
c++ - 快速计算两个数组之间相等的字节数
我编写函数int compare_16bytes(__m128i lhs, __m128i rhs)
是为了使用 SSE 指令比较两个 16 字节数:该函数返回执行比较后有多少字节相等。
现在我想使用上面的函数来比较任意长度的两个字节数组:长度可能不是 16 字节的倍数,所以我需要处理这个问题。我怎样才能完成下面功能的实现?我怎样才能改进下面的功能?
c++ - 使用 XMM0 寄存器和内存提取(C++ 代码)的速度是仅使用 XMM 寄存器的 ASM 的两倍 - 为什么?
我正在尝试实现一些内联汇编程序(在 Visual Studio 2012 C++ 代码中)以利用 SSE。我想添加 7 个数字 1e9 次,所以我将它们从 RAM 放置到 CPU 的 xmm0 到 xmm6 寄存器。当我使用以下代码在 Visual Studio 2012 中使用内联汇编执行此操作时:
C++ 代码:
我的 ASM 代码:
这是来自 C++ 编译器的反汇编代码,用于代码“resVal+=val1+val2+val3+val4+val5+val6+val7”:
可以看出,编译器只使用一个 xmm0 寄存器,其他时候它从 RAM 中获取值。
两种代码(我的 ASM 代码和 c++ 代码)的答案是相同的,但是 c++ 代码大约需要我的 asm 代码一半的时间来执行!
我读过关于 CPU 寄存器的信息,使用它们比内存快得多。我不认为这个比例是真的。为什么 asm 版本的 C++ 代码性能较低?
optimization - 如何使用 SSE2/SSE3/SSE4 处理 24 位 3 通道彩色图像?
我刚开始使用SS2优化图像处理,但是对于3通道24位彩色图像却一无所知。我的像素数据由 BGR BGR BGR ... ,unsigned char 8-bi 排列,所以如果我想用 SSE2/SSE3/SSE4 的指令 C/C++ fun 实现 Color2Gray,我该怎么办?我的像素数据需要对齐(4/8/16)吗?我读过文章:http ://supercomputingblog.com/windows/image-processing-with-sse/ 但它是 ARGB 4 通道 32 位颜色,每次准确处理 4 色像素数据。谢谢!
//RGB->灰色:Y=0.212671*R + 0.715160*G + 0.072169*B
assembly - 将 64 位整数加载到双精度 SSE2 寄存器的最佳方法?
xmm
在 32 位模式下在 SSE2 寄存器中加载 64 位整数值的最佳/最快方法是什么?
在 64 位模式下,cvtsi2sd
可以使用,但在 32 位模式下,它只支持 32 位整数。
到目前为止,我还没有发现太多:
- 使用
fild
,fstp
堆叠然后movsd
注册xmm
- 加载高 32 位部分,乘以 2^32,加上低 32 位
第一个解决方案很慢,第二个解决方案可能会引入精度损失(编辑:无论如何它很慢,因为必须将低 32 位转换为无符号......)
有更好的方法吗?
assembly - 将 xmm3 中的四个浮点数转换为内存中的四个整数
我是sse的新手,我很难找到它,请告诉我将xmm3寄存器中的四个打包浮点数转换(截断为“(int)float_”)的好方法是什么,并将其存储到内存(有些像“movaps oword [edx+32], xmm3”存储很清楚,但我不知道如何转换)
c++ - sse2 乘法向量 X 和 Y 在 cpp 中使用多线程算法
所以我的线程代码是:
有片段主要功能:
loc_N 是每个线程的元素数。向量 x 和 y 的 N 大小。ntimes - 是多次重复算法。threadNo - 线程号。
我不知道为什么当我有三个线程时程序在 ry0 = _mm_load_pd (ptrDat-> y + i); 上崩溃了
c++ - #error "SSE2 指令集未启用" 包含时
我正在尝试使用 cmake 编译一些 C++ 代码并使用 include<emmintrin.h>
进行 make 并得到以下 make 错误:
我有一个带有 Linux(Mint)系统(内核 3.5)的 Intel Celeron Dual Core 处理器。
根据维基百科,赛扬双核能够执行 SSE2 指令,并且 sse2 标志根据/proc/cpuinfo
. 但是这个问题的作者提到了英特尔赛扬对 SSE 的有限支持。
我已经尝试在我的以下文件中使用 SSE 编译器选项CMakeLists.txt
:
..但没有任何改变。cmake .
工作正常,但make
给出了上面的错误消息。
我是否必须更改 CMakeLists.txt 中的设置,还是赛扬双核根本不(完全)支持 SSE2?
x86 - SSE2 指令以相反的顺序加载整数
是否有任何 SSE2 指令以相反的顺序int
从缓冲区加载 128 位向量寄存器?int