0.2.2以及以前版本中处理128位数据的错误

    在0.2.2以及以前版本中,用movdqa/movdqu作为测试测试128位传输的指令。但是,这2条指令是SSE2才有的,在只有SSE指令的CPU上是没有的。Intel的指令手册没有说明某特定指令在什么CPU上可用、在什么CPU上没有,所以我在做的时候把指令写进程序,在我的PIII机器上运行,没想到伊一闭眼就过去了......真过去了!!??问伊是如何过去的......原来是悄悄地过去了,竟然没有扔一个例外!!??......不过我可晕过去了......当时因为没有例外,就把这2条指令当作128位的传输指令使用了。虽然Intel的SSE教程中没有这2条指令,不过毕竟是简单指令,何况SSE中有简单的整数逻辑运算指令(orps、andps、xorps),所以想当然地认为有整数加载指令是合理的。

    最近反复研究得到的测试数据,实在有很多地方不能自圆其说,于是怀疑其正确性。编程序测试这2条指令的效果......没想到PIII竟然是个马大哈!!??请看下表:

指令 movq movdqa movdqu
编码 0f 6f/7f + 地址 66 0f 6f/7f + 地址 f3 0f 6f/7f + 地址

其中,内存到寄存器的传输取6f,寄存器到内存的传输取7f。可见,movdqa/movdqu是在movq前面加一个前缀而得到的。比较指令执行前后的数据区变化,发现PIII一闭眼就把2个前缀给扔了,把这2条指令当作movq执行了!!??所以,在只有SSE的CPU上,不能用movdqa/movdqu指令测试128位传输。

    在SSE指令中没有128位的整数传输指令,所以要测试128位整数传输是不可能的。在新的程序中,这种情况下用128位浮点传输代替整数传输来进行测试。浮点传输的指令是movaps/movups。但是,浮点传输和整数传输毕竟是有区别的:浮点读需要判断读入的数据是否是正确的浮点数,如果不是,则产生例外。而这些判断是需要时间的,所以浮点传输可能比整数传输要慢,用浮点传输代替整数传输,得到的结果不具有可比性。不过在程序中,128位传输一般只作为参考值列出,参数判决一般是以通用寄存器组上的32位传输的测试值为依据的,所以这里的情况对原来的程序和分析影响不是很大。当然对部分文章和其结论还是有影响的。

    下面的文章由于上面的错误有小的改动,不影响其正确性:

测试准备:指令选取

L1和L2容量

寄存器间的传输

No Cache操作

对齐和未对齐

    下面的文章的结论稍有改变,但影响也不大:

L1性能

    下面的文章不再适用,由于其正确的测试在PIII上无法进行,现在只有将其取消了:

movdqa和movdqu

    其它文章除了数据表稍有差异外,没有变化。


Leading Cloud Surveillance, Recording and Storage service; IP camera live viewing

Leading Enterprise Cloud IT Service; cloud file server, FTP Hosting, Online Storage, Backup and Sharing

Powered by FirstCloudIT.com, a division of DriveHQ, the leading Cloud IT and Cloud Surveillance Service provider since 2003.