sse相关内容

在 x64_64 Intel CPU 上,SSE 未对齐的内在负载是否比内在对齐的负载慢?

我正在考虑更改一些当前需要 16 字节对齐数组并使用 _mm_load_ps 放宽对齐约束并使用 _mm_loadu_ps 的代码高性能代码.关于内存对齐对 SS​​E 指令的性能影响有很多神话,所以我做了一个小测试用例,什么应该是内存带宽绑定循环.使用对齐或未对齐的负载内在函数,它通过大型数组运行 100 次迭代,将元素与 SSE 内在函数相加.源代码在这儿.https://gist.githu ..
发布时间:2021-06-15 19:18:59 其他开发

非时间负载和硬件预取器,它们一起工作吗?

当从连续的内存位置执行一系列 _mm_stream_load_si128() 调用 (MOVNTDQA) 时,硬件预取器是否仍然启动,或者我应该使用显式软件预取(带 NTA 提示)是为了获得预取的好处,同时还能避免缓存污染? 我问这个的原因是因为他们的目标在我看来是矛盾的.流式加载将绕过缓存获取数据,而预取器尝试主动将数据提取到缓存中. 当顺序迭代一个大型数据结构时(处理后的数据在很长 ..
发布时间:2021-06-15 19:00:15 其他开发

SSE归一化比简单近似慢?

我正在尝试标准化一个 4d 向量. 我的第一个方法是使用 SSE 内在函数——它为我的向量算法提供了 2 倍的速度提升.这是基本代码:(v.v4 是输入)(使用 GCC)(所有这些都是内联的) //求正方形v4sf s = __builtin_ia32_mulps(v.v4, v.v4);//设置t为平方v4sft = s;//将4个方块相加s = __builtin_ia32_shufp ..
发布时间:2021-06-08 18:59:40 C/C++开发

无法使用 nasm 编译带有 xmmword 操作数大小的汇编代码

我试图使用 nasm(nasm -o file input.asm)编译汇编代码并在以下代码片段的第 2 行抛出错误: mov rsi, 0x400200movdqu xmm0,xm​​mword [rsi]没有 我不确定是否可以使用 nasm 编译具有 128 位寄存器的指令,但是在涉及 128 位寄存器的情况下,还有其他方法可以使用 nasm 进行编译吗? 解决方案 内存操作数无需 ..
发布时间:2021-06-07 18:43:33 其他开发

用于大型密集矩阵乘法的循环平铺/阻塞

我想知道是否有人可以向我展示如何有效地使用循环平铺/循环阻塞进行大型密集矩阵乘法.我正在用 1000x1000 矩阵做 C = AB.我已经按照 Wikipedia 上的示例进行循环平铺,但使用平铺获得的结果比不使用平铺效果更差. http://en.wikipedia.org/wiki/Loop_tiling http://software.intel.com/en-us/artic ..
发布时间:2021-06-02 18:30:56 其他开发

如何在LLDB中写入XMM寄存器

我正在尝试使用LLDB API从python中的寄存器读取和写入值.对于通用寄存器,我一直使用 frame.register ['register name'].value 读取和写入寄存器值,这对我来说是成功的. 但是,当我接近浮点寄存器时,我发现无法再这样做了,因为某些寄存器(例如XMM寄存器)没有 value 属性例如, frame.register ['xmm0'].value 将返 ..
发布时间:2021-05-30 19:37:09 Python

如何将单精度浮点数的XMM寄存器转换为整数?

我在XMM寄存器中有一堆打包的浮点数(使用SSE内在函数): __ m128 xmm = _mm_set_ps(4.0f,3.0f,2.0f,1.0f); 我想一次将所有这些转换为整数.我发现了一个内在函数,它可以满足我的要求( _mm_cvtps_pi16()),但是它会生成4x16位的 short 而不是成熟的 int .名为 _mm_cvtps_pi32()的内部函数会产生 int ..
发布时间:2021-05-16 19:51:35 C/C++开发

使用SSE的矩阵向量和矩阵矩阵乘法

我需要编写矩阵向量和矩阵矩阵乘法函数,但是我不能将头放在SSE命令周围. 矩阵和向量的维数始终是4的倍数. 我设法编写了矢量-矢量乘法函数,如下所示: void vector_multiplication_SSE(float * m,float * n,float *结果,无符号const int大小){我__declspec(align(16))__ m128 * p_m =(_ ..

当写入2个缓存行的一部分时,为什么在Skylake-Xeon上`_mm_stream_si128`要比`_mm_storeu_si128`慢得多?但是对Haswell的影响较小

我有类似以下的代码(简单的加载,修改,存储)(我已对其进行了简化以使其更具可读性): __ asm__ __volatile__("vzeroupper":::);尽管(...) {__m128i in = _mm_loadu_si128(inptr);__m128i out = in;//实际代码的作用远不止于此,但我已经对其进行了简化_mm_stream_si12(outptr,out); ..
发布时间:2021-05-16 19:18:52 其他开发

尝试使用x86 asm SSSE3将大字节序转换为小字节序

我已经做了一段时间的arm asm,并尝试使用x86 asm ssse3优化简单的循环.我找不到将大字节序转换为小字节序的方法. ARM NEON仅具有一个矢量指令即可完成此操作,而SSSE3则没有.我尝试使用2个移位,然后使用一个或,但是如果我们向左移动8个(数据饱和),则需要将每个插槽的位数改为32位而不是16位. 我查看了PSHUFB,但是当我使用它时,16位字的前半部分始终为0 ..
发布时间:2021-05-16 18:35:07 C/C++开发

解释GDB寄存器(SSE寄存器)

我已经使用GDB 1天了,对此我已经有了相当的了解.但是,当我使用GDB和打印寄存器在最后一个分号处设置断点时,我无法完全解释存储在XMM寄存器中的数据的含义. 我不知道数据是否为(MSB> LSB)格式,反之亦然. __m128i S = _mm_load_si128((__ m128i *)Array16Bytes);} 这就是我得到的结果. (gdb)打印$ xmm0$ 1 ..
发布时间:2021-05-10 18:35:13 服务器开发

x86上的堆栈对齐

在x86(32位)平台上运行带有 -march = pentium4 的gcc-4.8.1编译的代码时,在x86(32位)平台上发生了一个神秘的总线错误.我将问题追溯到SSE指令: movdqa%xmm5,0x50(%esp) ,其中esp = 0xbfffedac. movdqa 要求地址是16字节对齐的,此处不是这种情况,因此是总线错误. 如果使用 -march = native ..
发布时间:2021-05-09 20:55:14 服务器开发

.NET Core中Gamedev的浮点确定性

背景 我们正在使用C#和.NET Core开发 RTS游戏引擎.与大多数其他实时多人游戏不同,RTS游戏的工作方式是将玩家的输入与其他玩家同步,并同时在所有客户端上同步运行游戏模拟.这要求游戏逻辑具有确定性,以便游戏不会不同步. 浮点运算是不确定性的一种潜在来源.从我收集的数据来看,主要的问题是旧的x87 FPU指令-它们使用内部80位寄存器,而IEEE-754浮点值是32位或64位, ..
发布时间:2021-05-08 19:56:25 C#/.NET