我已经看到了我们在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
。为了简便起见,我们说我们的载体在存储地点举行A
,B
和C
也。我们的等效汇编代码是:
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的目的是提供更大的寄存器,以及对多个数据执行相同指令的能力)。