问题标签 [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.
gcc - 有没有办法用 gcc 自动生成 MMX 指令(不是 SSE)
看起来 gcc 会很高兴地自动矢量化简单的示例,并发出 SSE 指令。有没有办法只发出 MMX 指令?
例如,如果我在 Godbolt 上尝试以下示例:
在 GCC 9.2 上编译-mmmx -O3 -m32 -msse2
,我得到
但是没有 sse (即-mmmx -O3 -m32 -mno-sse2
),它只能使用通用寄存器,并且没有 mmx 指令:
我想跑一些 Benchmarks,比较只用 x87-fpu、MMX、SSE 和 SSE2 运行的效果,但是如果 gcc 不会发出 MMX 指令,那么为 x87 和 x87+mmx 编译不会有任何区别.
c++ - 如何将 MMX mulH 和 mulL 用于两个 64 位整数以获得一个 128 位整数
您好,我正在研究另一个任意精度整数库。我想实现乘法,但是当我没有工作时我被卡住_m_pmulhw
了。关于 MMX 指令的文档<mmintrin.h>
很少。当我测试它时,当我将两个 UINT64_MAX 相乘时,它只会让我胡言乱语。
我不知道为什么它不工作我有一个 A6-4400M APU...
核心信息的输出:MMX * Supports MMX instruction set
所以我想我可以说,它不是不受支持的。如果有人可以给我一些关于如何完成这项工作的提示,谢谢。
编译器:gcc
IDE:视觉工作室代码
visual-c++ - 对于 64 位目标,在 MSVC 2019 中找不到 MMX 内在函数,例如 _mm_cvtpd_pi32;从 2013 年开始变化?
我目前正在将大型代码库从 VS2013 更新到 VS2019。我遇到的编译器错误之一如下:
intrinsics.h(348): 错误 C3861: '_mm_cvtpd_pi32': 找不到标识符
此内在函数在 Visual Studio 的“emmintrin.h”中定义。我只在针对 64 位构建时收到此错误。仔细观察后发现,在 2013 年至 2019 年期间,emmintrin.h 的定义从此发生了变化:
对此:
即:预处理器指令确保这些函数现在仅可用于 32 位目标。产生错误的第 3 方头文件使用这些函数,而与目标无关(64 位或 32 位)。据推测,这里最好的做法是编辑此头文件以确保仅对 32 位目标调用此函数。然而,我更好奇的是,为什么从 2013 年到 2019 年会发生这种变化?我在这里看到了这个函数的描述:
https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_cvtpd_pi32&expand=1705
它从一开始就不适用于 64 位目标吗?或者它是否已被我需要考虑的 64 位版本替换?
assembly - Uint8 到 mm0 寄存器
我一直在使用此演示文稿中的示例(幻灯片 41)。
就我而言,它执行 alpha 混合。
我想用汇编程序用c重写它。
现在,我有这样的事情:
编译时我收到此消息:Error: (%dl) is not a valid base/index expression
关于汇编程序中的第一行。我怀疑这是因为alpha
is Uint8
,我尝试投射它,但后来出现分段错误。在这个例子中,他们谈论4 16-b zero-padding α
的是我不太清楚的。
c++ - 如何使用 MMX 添加数组的所有元素?
我使用汇编程序插入,无法完成任务。我需要使用 MMX 添加数组的所有元素
我试图用 C++ 重写另一个 mmx 代码。它将所有变量写入寄存器,然后写入结果数组。理论上加起来。但是变量的添加是错误的
c++ - 如何使用 mmx 将值保存到变量?(c++)
如何继续代码,例如数组的 3 个元素存储在变量 A 中。也就是说,我只需要获取一个元素并将其保存到一个变量中
gdb - 为什么 GDB 没有制表符完成 mmx 寄存器名称(mm0-mm7)
我使用 gdbinfo registers <tab>
查看所有寄存器,但没有看到 MMX 寄存器。
我的 CPU 是 Xeon Platinum 8163,一个支持 SSE 和 MMX 的现代 Xeon cpu。所以我认为这是一个 gdb 问题(如果我是对的)。
为什么 gdb 不支持显示 mmx 寄存器,而 mmx 寄存器与基本寄存器和 sse 寄存器相比应该具有相同的重要性级别。
arrays - 卡在使用 NASM 使用 MMX 指令对两个数组求和
我被赋予了以下任务:
给定两个具有 16 个元素的数组:NIZA RESW 16 和 NIZB RESW 16
在第三个数组 (NIZC RESW 16) 中存储以下值:NIZC[i]=NIZA[i]+NIZB[i] 使用 MMX 指令并使用 NASM 编译它
这是我到目前为止得到的:
编译给定数组后,并用以下两个数组对其进行测试,第三个数组仅存储 16 个元素中的 4 个。(如下图所示)
有人知道为什么它只存储 16 个元素中的 4 个吗?任何帮助表示赞赏。
如果您对函数有任何疑问,这些函数print_string
print_int
print_nl
是通过将字符串压入 EAX 寄存器来打印出字符串、换行符和整数的函数,还要注意这是一个 32 位程序。
intel - 固有向量元素类型的名称和含义是什么,例如 epi64x 或 pi32?
intel 内部函数的名称中包含向量的子类型。例如,_mm_set1_ps
是一个ps
,这是一个packed single-precision
又名。一个float
。尽管它们中的大多数含义很清楚,但它们的“全名”之类packed single-precision
的功能描述并不总是很清楚。我创建了下表。不幸的是,有些条目丢失了。它们的价值是什么?表格下方的其他问题。
缩写 | 全名 | C/++ 等价物 |
---|---|---|
ps | 打包单精度 | 漂浮 |
酸碱度 | 压缩半精度 | 没有任何** |
PD | 压缩双精度 | 双倍的 |
pch | 压缩半精度复数 | 没有任何** |
pi8 | ??? | int8_t |
pi16 | ??? | int16_t |
pi32 | ??? | int32_t |
外延8 | ??? | int8_t |
外延16 | ??? | int16_t |
外延32 | ??? | int32_t |
外延64 | ??? | int64_t |
外延64x | ??? | int64_t |
附加问题:
- 我错过了吗?
epiX
和 和有什么不一样piX
?- 为什么不
pi64
存在? epi64
和 和有什么不一样epi64x
?
** 我找到了这个,但似乎没有标准的方法来表示 C/++ 中的半精度(复数)值。如果这有任何改变,请纠正我。
assembly - SFENCE 属于什么指令集?
我一直在对 AMD64 (x86-64) 指令进行大量研究,这有点令人困惑。很多时候,官方 CPU 文档并未将指令指定为特定指令集的一部分,并且互联网有时会根据特定指令所属的指令集进行划分。这方面的一个例子是SFENCE
,一些消息来源声称它是 EMMX 的一部分,而另一些则声称它是 SSE 的一部分。
我试图将所有这些都组织在一个电子表格中以帮助学习,但是在一个以技术和精确着称的领域中,这些不一致令人难以置信的沮丧。