如何找到所有SSE指令的列表?如果CPU不支持SSE会发生什么?


6

所以我一直在阅读有关处理器如何工作的信息。现在我在说明(SSE,SSE2等)的东西。(这很有趣)。

我有很多问题(我一直在维基百科上阅读这些内容):

  1. 我已经看到了SSE上添加的一些指令的名称,但是没有任何解释(也许是SSE4?它们甚至没有在维基百科上列出)。我在哪里可以阅读他们的作品?

  2. 我如何知道正在使用哪些指令?

  3. 如果我们确实知道正在使用哪些,那么假设我正在做一个比较,(这可能是我曾经问过的最愚蠢的问题,我不知道汇编,但是)是否可以直接使用指令在汇编代码?(我一直在看这个:http//asm.inightmare.org/opcodelst/index.php?op = CMP

  4. 处理器如何解释指令?

  5. 如果我的处理器没有任何SSE指令,会发生什么?(我想在我们要做比较的情况下,我们不能,对吧?)

Answers:


11

我已经看到了我们在SSE上添加的一些指令的名称,但是没有解释所有这些指令(也许是SSE4?它们甚至没有在维基百科上列出)。我可以在哪里阅读他们的作品?

最好的资源来自设计扩展程序的人:英特尔。最新参考资料是英特尔®64和IA-32架构软件开发人员手册 ; 我建议您下载合并的卷1到3C(该页面上的第一个下载链接)。您可能需要查看Vol. 1, Ch. 12- 使用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。为了简便起见,我们说我们的载体在存储地点举行ABC也。我们的等效汇编代码是:

movq   MM0, [A]
paddsb MM0, [B]
movq   [C], MM0

但是,这个操作也可以很容易地用软件完成。例如,以下C代码执行等效操作(因为a char为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];
}

您可以猜测上面循环的汇编代码看起来如何,但很明显它会包含更多的指令(​​因为我们现在需要一个循环来处理添加向量),因此,我们需要执行更多的指令取。这类似于处理器的字长对计算机性能的影响(MMX / SSEx的目的是提供更大的寄存器,以及对多个数据执行相同指令的能力)。


2

以与问题相同的顺序回答您:

  1. 最简单的方法是访问英特尔网站并下载白皮书。事件eh处理器的SDK手册将包含所有必需的详细信息。是一个这样的链接。是SSE指令集的助记符和解释的另一个链接。
  2. 究竟是什么意思使用了哪些指令?您在寻找有关处理器或特定应用程序的信息吗?
    对于处理器,我不了解Windows,但在Linux上,您只需阅读它的处理器标志。通过# lshw命令更容易完成。
    另一方面,特定于应用程序,我不确定,您可以随时反汇编可执行文件,并查看正在使用的说明。由于大多数应用程序都符合大众需求,因此它们仅使用Generic x86指令集。要使用更多特定于处理器的指令,您应该在系统上手动编译应用程序。
  3. 你总是可以运行一个模拟器。如果要在编程项目中使用汇编代码,可以在C和C ++中执行。我只在C中使用了ASM代码,所以不知道是否有其他语言支持它。有关使用在线ASM的帮助,请参阅此SO问题
  4. 这个问题主要集中在计算机体系结构领域。虽然我可以在这里解释一下,但这并不容易。还有另一个SU问题涉及这个问题。
  5. 为了回答你的具体问题,SSE指令集仅在1999年问世,而CMP指令在此之前已经存在。它也是8080中指令集的一部分。在任何情况下,我们的机器都是Turing-Complete,老式微处理器可以进行比较。只是,如果没有明确的指示,这样做会更难。每个指令集只是执行某些指令的更快,更简单和更优化的方式,它几乎不增加新的功能,因为图灵完成机器总是可以compute everything that is computable

1

我已经看到了SSE上添加的一些指令的名称,但是没有任何解释(也许是SSE4?它们甚至没有在维基百科上列出)。

那不对。维基百科上有关于每个 x86指令的列表,包括甚至已弃用和未记录的指令

我在哪里可以阅读他们的作品?

要了解您需要阅读其制造商手册的任何CPU。在这种情况下,英特尔AMD。对于紧凑的指令汇编,这是两个可靠的来源

如果我们确实知道正在使用哪些,那么假设我正在做一个比较,(这可能是我曾经问过的最愚蠢的问题,我不知道汇编,但是)是否可以直接使用指令在汇编代码?(我一直在看这个:http//asm.inightmare.org/opcodelst/index.php?op = CMP

汇编只是机器代码的人类可读版本。您看到的名称是汇编中的指令的助记符,因此它们当然一直在汇编中直接使用

如果我的处理器没有任何SSE指令,会发生什么?(我想在我们要做比较的情况下,我们不能,对吧?)

实际上现在你很难得到一个不支持SSE的x86 CPU,因为它是自20年前Pentium III引入的。但通常如果CPU看到无效的指令/操作码,它将引发异常。通常,操作系统只是宣布错误,然后终止程序。但是如果需要,应用程序可以捕获该异常并在软件中处理指令。由于状态在程序和异常处理程序之间切换,这将导致极端低效,但程序可以无需修改即可运行。

过去曾经使用过这种方法,当时有些CPU没有内置FPU,而浮点数学则是在一个单独的协处理器中完成的。在这种情况下,如果没有连接协处理器,则浮点指令将引发异常,异常处理程序将在将它们传回程序之前用软件计算操作。请参阅MS-DOS中x87浮点仿真的协议是什么?

一些Hackintosh补丁也使用它来使MacOS X(需要SSE2 / 3或更高版本)在只有SSE的旧CPU上运行


0

仅回答第5个问题。假设您在半兼容机器上运行机器代码。因此CPU最终可能会进入无效指令。

有一个协议,现代操作系统和CPU协同工作,以处理这种情况。CPU存储有关刚刚发生的事情的信息并跳转到OS代码中以获得帮助,因此操作系统能够正确评估情况并且很可能导致误导的进程(即它将进程从其就绪队列中移除并回收相关的数据结构)。

在UNIX系统上,非法指令对应于SIGILL,SIGILL是进程可能已注册信号处理程序例程的信号。如果它这样做,它不会被杀死,而是调用相应的信号处理程序。否则,核心转储将写入磁盘。您可以在signal(7)或Rochkind,“高级UNIX编程”,第9.1章中阅读此内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.