Bla*_*ore 7 cpu computer-architecture cpu-architecture
所以我一直在阅读有关处理器如何工作的信息。现在我正在使用说明(SSE、SSE2 等)。(这很有趣)。
我有很多问题(我一直在维基百科上阅读这些东西):
我已经看到了在 SSE 上添加的一些指令的名称,但是没有对它们中的任何一个进行解释(也许是 SSE4?它们甚至没有在维基百科上列出)。我在哪里可以阅读他们的工作?
我如何知道正在使用这些说明中的哪些?
如果我们知道正在使用哪些,假设我正在做一个比较,(这可能是我问过的最愚蠢的问题,不过我不知道汇编)是否可以直接使用指令在汇编代码上?(我一直在看这个:http : //asm.inightmare.org/opcodelst/index.php?op=CMP)
处理器如何解释指令?
如果我的处理器没有任何 SSE 指令,会发生什么?(我想如果我们想要进行比较,我们将无法进行,对吗?)
Bre*_*ugh 11
我已经看到我们在 SSE 上添加的一些指令的名称,但是没有对所有指令进行解释(也许是 SSE4?它们甚至没有在维基百科上列出)。我在哪里可以阅读他们的工作?
最好的来源将直接来自设计扩展的人:英特尔。权威参考资料是Intel® 64 and IA-32 Architectures Software Developer Manuals;我建议您下载合并的第 1 卷到第 3C 卷(该页面上的第一个下载链接)。您可能想看看Vol. 1, Ch. 12- Programming with SSE3、SSSE3、SSE4 和 AESNI。要参阅特定说明,请参阅Vol. 2, Ch. 3-4。(附录 B 也有帮助)
我怎么知道正在使用这些说明中的哪一个?
仅当您正在运行的程序实际使用它们时才使用这些指令(即调用对应于各种 SSE4 指令的字节码)。要找出程序使用的指令,您需要使用反汇编程序。
如果我们知道正在使用哪个,假设我正在做一个比较,(这可能是我做过的最愚蠢的问题,不过我不知道汇编)可以直接在汇编代码?(我一直在看这个:http : //asm.inightmare.org/opcodelst/index.php?op=CMP)
处理器如何解释指令?
您可能想看看我对“ CPU 如何‘知道’命令和指令的实际含义? ”的回答。当您手动编写汇编代码以生成可执行文件时,您将“人类可读”的汇编代码传递给汇编程序,汇编程序将指令转换为处理器执行的实际 0 和 1。
如果我的处理器没有任何 SSE 指令,会发生什么?(我想如果我们要进行比较,我们将无法进行,对吗?)
由于您的计算机是图灵完备的,如果没有专用硬件,它可以使用软件算法执行任意数学函数。显然,在硬件中进行密集的并行或矩阵数学运算比在软件中快得多(需要许多指令循环),因此这会导致最终用户的速度变慢。根据程序是如何创建的,它是可能的,它可能需要一个特定的指令(从SSE4集即一个),但鉴于这是可以做到的软件同样的事情(从而对更多的处理器可用),这种做法是少见.
作为上述示例,您可能还记得处理器首次推出MMX 指令集扩展时。假设我们想要将两个 8 元素、有符号 8 位向量相加(因此每个向量都是 64 位,等于单个 MMX 寄存器),或者换句话说,A + B = C. 这可以通过一个名为 的MMX 指令来完成paddsb。为简洁起见,假设我们的向量保存在内存位置A、B、 等C。我们等效的汇编代码是:
movq MM0, [A]
paddsb MM0, [B]
movq [C], MM0
Run Code Online (Sandbox Code Playgroud)
然而,这个操作也可以很容易地在软件中完成。例如,以下 C 代码执行等效操作(因为 achar是 8 位宽):
#define LEN 8
char A[LEN], B[LEN], C[LEN];
/* Code to initialize vectors A and B... */
for (i = 0; i < LEN; i++)
{
C[i] = A[i] + B[i];
}
Run Code Online (Sandbox Code Playgroud)
您可能会猜到上述循环的汇编代码会是什么样子,但很明显它会包含更多的指令(因为我们现在需要一个循环来处理添加向量),因此,我们需要执行更多的指令取。这类似于处理器的字长如何影响计算机的性能(MMX/SSEx 的目的是提供更大的寄存器,以及对多条数据执行相同指令的能力)。
| 归档时间: |
|
| 查看次数: |
7486 次 |
| 最近记录: |