本文介绍了为什么AVX-256 VMOVAPS指令只复制四个单precision花车,而不是8?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想对一些较新的Intel处理器可用的256位AVX指令来熟悉自己。我已经验证了我的i7-4720HQ支持256位AVX指令。我遇到的问题是,VMOVAPS指令,它应该复制8个单precision浮点值,只能复制4。

 点PROC
    VMOVAPS YMM1,ymmword PTR [RCX]
    VDPPS YMM2,YMM1,ymmword PTR [RDX] 255
    VMOVAPS ymmword PTR [RCX],YMM2
    MOVSS XMM0,DWORD PTR [RCX]
    RET
点ENDP

如果你不熟悉的调用约定时,Visual C ++ 2015年预计这一函数的返回(因为它是一个浮动),以在返回在XMM0。

除此之外,该标准是第一个参数在RCX传递,第二个参数在RDX传递。

下面是C code调用这个函数。

  _declspec(调整(32))浮D1 [] = {1.0F,1.0F,1.0F,1.0F,1.0F,1.0F,1.0F,1.0F};
_declspec(调整(32))浮D2 [] = {2.0F,2.0F,2.0F,2.0F,2.0F,2.0F,2.0F,2.0F};
的printf(点产品测试:%F \\ N,点(D1,D2));

点函数的返回值始终是8.0。除了这一点,我已调试的功能,并发现第一组件指令后,只有四个值被复制到YMM1。 YMM1的其余部分保持为零。

我是不是做错了什么吗?我已经通过了Intel的文档和一些第三方文档看去。至于我可以告诉大家,我做的一切权利。我使用了错误的指令?顺便说一句,如果你来这里是为了告诉我使用英特尔编译器内在函数,不要打扰。


解决方案

您忘了阅读 VDPPS 指令集参考页。它提到,结果在两半制备:

It's not the VMOVAPS that's wrong.

这篇关于为什么AVX-256 VMOVAPS指令只复制四个单precision花车,而不是8?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-29 14:08