问题标签 [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.

0 投票
2 回答
2221 浏览

c++ - SSE/SSE2 指令的打包和解包数据?

我正在尝试了解有关 SSE/SSE2 如何工作的更多信息:我知道 SSE/SSE2 使用大小为 128 位(16 字节)的 mmx 寄存器,并且通常这些寄存器有 4 个浮点单元格,我可以通过打包来存储我的浮点数. 在得到结果之前,我应该“解压它们”。

我的问题是:既然我是菜鸟,为什么要将这些值打包到 xmm 寄存器中,为什么要解压缩它们?这有什么好处?

0 投票
2 回答
8240 浏览

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 的修改(相同)版本。

0 投票
4 回答
2539 浏览

c++ - 快速计算两个数组之间相等的字节数

我编写函数int compare_16bytes(__m128i lhs, __m128i rhs)是为了使用 SSE 指令比较两个 16 字节数:该函数返回执行比较后有多少字节相等。

现在我想使用上面的函数来比较任意长度的两个字节数组:长度可能不是 16 字节的倍数,所以我需要处理这个问题。我怎样才能完成下面功能的实现?我怎样才能改进下面的功能?

0 投票
2 回答
4053 浏览

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++ 代码性能较低?

0 投票
2 回答
3524 浏览

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

0 投票
1 回答
2722 浏览

assembly - 将 64 位整数加载到双精度 SSE2 寄存器的最佳方法?

xmm在 32 位模式下在 SSE2 寄存器中加载 64 位整数值的最佳/最快方法是什么?

在 64 位模式下,cvtsi2sd可以使用,但在 32 位模式下,它只支持 32 位整数。

到目前为止,我还没有发现太多:

  • 使用fild,fstp堆叠然后movsd注册xmm
  • 加载高 32 位部分,乘以 2^32,加上低 32 位

第一个解决方案很慢,第二个解决方案可能会引入精度损失(编辑:无论如何它很慢,因为必须将低 32 位转换为无符号......)

有更好的方法吗?

0 投票
1 回答
335 浏览

assembly - 将 xmm3 中的四个浮点数转换为内存中的四个整数

我是sse的新手,我很难找到它,请告诉我将xmm3寄存器中的四个打包浮点数转换(截断为“(int)float_”)的好方法是什么,并将其存储到内存(有些像“movaps oword [edx+32], xmm3”存储很清楚,但我不知道如何转换)

0 投票
0 回答
276 浏览

c++ - sse2 乘法向量 X 和 Y 在 cpp 中使用多线程算法

所以我的线程代码是:

有片段主要功能:

loc_N 是每个线程的元素数。向量 x 和 y 的 N 大小。ntimes - 是多次重复算法。threadNo - 线程号。

我不知道为什么当我有三个线程时程序在 ry0 = _mm_load_pd (ptrDat-> y + i); 上崩溃了

0 投票
1 回答
12151 浏览

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?

0 投票
2 回答
4810 浏览

x86 - SSE2 指令以相反的顺序加载整数

是否有任何 SSE2 指令以相反的顺序int从缓冲区加载 128 位向量寄存器?int