问题标签 [mmx]
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++ - MMX 与 SSE2 性能比较
问题 :
我将 MMX 代码转换为相应的 SSE2 代码。我预计几乎 1.5x-2x 的加速。但两者都花费了完全相同的时间。为什么?
设想:
我正在学习 SIMD 指令集及其性能比较。我进行了一个数组操作,其中 X 和 Y 是"char"Z = X^2 + Y^2
类型的大型一维数组。X 和 Y 的值被限制为小于 10,因此 Z 始终<255 (1 Byte)。(不用担心任何溢出)。
我先写了它的 C++ 代码,检查了它的时间。然后编写相应的汇编代码(~3x 加速)。然后我编写了它的 MMX 代码(~12x v/s C++)。然后我将 MMX 转换为 SSE2 代码,它的速度与 MMX 代码完全相同。从理论上讲,在 SSE2 中,与 MMX 相比,我预计加速大约 2 倍。
对于从 MMX 到 SSE2 的转换,我将所有 mmx reg 转换为 xmm reg。然后改变了几个动作指令等等。
我的 MMX 和 SSE 代码粘贴在这里:https ://gist.github.com/abidrahmank/5281486 (我不想把它们都粘贴在这里)
这些函数稍后会从 main.cpp 文件中调用,其中数组作为参数传递。
我做了什么 :
1 - 我浏览了英特尔和其他网站的一些优化手册。SSE2 代码的主要问题是16 _memory 对齐。当我手动检查地址时,发现它们都是 16 _memory 对齐的。但是我同时使用了MOVDQU和MOVDQA,但两者都给出了相同的结果,并且与 MMX 相比没有加速。
2 - 我进入调试模式并检查每个寄存器值并执行指令。它们的执行与我想的完全一样,即占用 16 个字节并输出 16 个字节。
资源 :
我在 Windows 7 和 Visual C++ 2010 中使用 Intel Core i5 处理器。
问题 :
所以最后一个问题是,为什么 SSE2 代码与 MMX 代码相比没有性能提升?我在 SSE 代码中做错了吗?还是有其他解释?
assembly - 尝试将 rax 复制到 mmx 寄存器时,GAS、MOVQ 引发操作数不匹配
我正在使用 gnu 程序集和 gcc 编译器。我必须使用 mmx 寄存器进行一些操作。我有一个字节的内存缓冲区,我正在从内存中读取 1 个字节到 %al,进行逻辑和操作并将 rax 左移 1 个字节并从内存中插入下一个字节的低位,直到 %rax 已满。然后当我尝试这样做时:
编译器抛出:错误:“movq”的操作数类型不匹配
例子:
这有效:
这不:
此代码不是完整代码 - 完整代码很长。它是为您的直觉而设计的。
为什么它那么讨厌我?我做错了什么。请不要抱怨获取这 5 位的方法,我只需要帮助将 rdx 存储到 mm0 中。
assembly - 现代处理器中是否总是存在 MMX 寄存器?
当我查看最新处理器的图表和概述时[1],我从未看到提到 MMX 寄存器 MM0 - MM7。但从规格来看,它们似乎仍然存在。是否可以依赖它们出现在所有支持 SSE 的处理器中?它们是否与更旧的 FPU 堆栈以外的任何东西发生冲突?它们是否与一般 64 位的物理寄存器相同?
虽然 XMM 和 YMM 对于向量来说要好得多,但我偶尔想使用 MMX 寄存器来存储值,否则这些值会溢出到堆栈中。Speedwise 这看起来好一点,而且有时我想避免额外的存储和加载。
assembly - O(1)时间内的二进制对数(在寄存器x86或SIMD上操作)而不移位?
我想看看是否有一种方法可以找到数字的二进制日志。假设你有数字 4,那么你加 2 得到 4 的幂是 2。
我知道这可以通过移位和计数来实现,但它使用O(N)
操作。有什么办法可以到O(1)
任何n
地方x = 2^n
吗?
我想在n
这里找到x
一次操作或O(1)
.
c - 在 Linux 中使用 MMX 进行图像处理
我想使用 MMX 指令集来优化我的 Linux C 程序,该程序对以 RGB 格式存储的图像执行大量操作(每个 RGB 组件都存储在一个无符号字符中)。这些操作是微不足道的:我从另一个像素中减去一个图像,并累加差值的绝对值之和。(基本上,我有一个小图像或图案,我试图找出该图案是否存在于更大的图像中)。
我知道这可以使用 MMX 指令以汇编语言编码,以 SIMD 方式执行单个字节操作。但是,有没有更简单的方法?也许是使用 MMX 指令的库或更高级别的接口?
c - 如何将 8 字节长整数的每个字节相加?
我正在学习如何在视频应用程序中使用英特尔 MMX 和 SSE 指令。我有一个 8 字节的字,我想将所有 8 个字节相加并生成一个整数作为结果。直接的方法是一系列 7 班次和加法,但这很慢。最快的方法是什么?是否有针对此的 MMX 或 SSE 指令?
这是这样做的缓慢方式
gcc - 无法通过 gcc 中的“-march=native”或 Core2 芯片中的任何其他标志激活 SSE 指令集
我的机器是 Core2 微架构,我尝试编译一些针对 SSE 指令集的算术代码。我在网上和官方手册上搜索,我相信我需要做的就是添加标志-march=native
,因为我的芯片支持SSE。
但是当我 gcc -march=native -Q --help=target -v
用来检查标志是否真的有效时,屏幕上显示的结果并不是我所期望的。例如:</p>
我发现所有 SSE(甚至 MMX)指令都被禁用。谁能告诉我为什么以及如何解决它?非常感谢!</p>
gcc - 使用 MOVAPS 的 x86 编译错误
我得到一个编译错误Error: operand type mismatch for 'movaps'
,谷歌搜索没有找到解决方案。movups
并addps
给出同样的错误。
这是一个相关的摘录:
为了完整起见,我.s
使用-m32
.
assembly - “错误 C2400:'opcode' 中的内联汇编程序语法错误”pxor 编译 ffmpeg 并启用 mmx 标志
我正在尝试在启用 mmx 标志(HAVE_MMX)的情况下编译(visual studio 2005)ffmpeg,但出现以下错误:“错误 C2400:'opcode' 中的内联汇编语法错误”它抱怨xpor_r2r
想法?
[更新] Jester 指出这可能是宏的问题:
#define mmx_r2r(op,regs,regd) \
__asm__ volatile (#op " %" #regs ", %" #regd)
直接使用:
__asm__ pxor mm7 mm7
works 添加volatile(如在宏中提到的)会产生与'opcode' found 'data_type'中相同的错误、语法错误。
仅从宏中删除volatile不起作用,而是在'opcode' found '('
相反,删除括号会在'opcode' found 'bad_token'中出现错误
vectorization - SIMD 整数存储
我正在编写一个使用 SSE 指令来相乘和相加整数值的程序。我用浮点数做了同样的程序,但我的整数版本缺少一个指令。
使用浮点数,在完成所有操作后,我将 de 值返回到常规浮点数组,执行以下操作:
temp4 是一个浮点数 *,而 temp3 是一个 __m128。
问题是我找不到整数的类似内在函数。我应该如何将值返回到常规数组?
非常感谢你的回答 ;)