gpt4 book ai didi

c - 为什么 AVX-256 VMOVAPS 指令只复制四个单精度 float 而不是 8 个?

转载 作者:太空宇宙 更新时间:2023-11-04 01:54:32 25 4
gpt4 key购买 nike

我正在尝试熟悉某些较新的英特尔处理器上可用的 256 位 AVX 指令。我已经验证了我的 i7-4720HQ 支持 256 位 AVX 指令。我遇到的问题是应该复制 8 个单精度浮点值的 VMOVAPS 指令只复制了 4 个。

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

如果您不熟悉调用约定,Visual C++ 2015 期望此函数的返回值(因为它是 float )在返回时位于 XMM0 中。

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

这是调用此函数的 C 代码。

_declspec(align(32)) float d1[] = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f };
_declspec(align(32)) float d2[] = { 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f };
printf("Dot Product Test: %f\n", dot(d1, d2));

点函数的返回值始终为 8.0。除此之外,我调试了该函数,发现在第一条汇编指令之后,只有四个值被复制到 YMM1 中。 YMM1 的其余部分保持为零。

我是不是做错了什么?我查看了英特尔文档和一些第三方文档。据我所知,我做的一切都是对的。我使用了错误的指令吗?顺便说一句,如果您是来告诉我使用英特尔编译器内在函数的,请不要打扰。

最佳答案

您忘记阅读VDPPS 的指令集引用页。它提到结果分为两半:

VDPPS (VEX.256 encoded version)
DEST[127:0] ← DP_Primitive(SRC1[127:0], SRC2[127:0]);
DEST[255:128] ← DP_Primitive(SRC1[255:128], SRC2[255:128]);

错的不是 VMOVAPS

关于c - 为什么 AVX-256 VMOVAPS 指令只复制四个单精度 float 而不是 8 个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36798584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com