首页  >  文章  >  后端开发  >  如何将 8 个字符从内存加载到 __m256 变量中:三种有效方法

如何将 8 个字符从内存加载到 __m256 变量中:三种有效方法

Barbara Streisand
Barbara Streisand原创
2024-11-03 15:52:02158浏览

How to Load 8 Characters from Memory into an __m256 Variable: Three Efficient Approaches

将 8 个字符从内存加载到 __m256 变量中:分析

问题:

您想要优化算法通过用内部 __m256 变量替换浮点缓冲区 [8] 来提高图像上的高斯模糊效果。

解决方案 1:使用 AVX2 的 PMOVZX 和 VCVTDQ2PS

这个该方法利用 PMOVZX 将 8 位字符扩展为 32 位整数,然后通过 VCVTDQ2PS 将其转换为浮点值。具体来说:

VPMOVZXBD   ymm0,  [rsi]   ; Byte to DWord
VCVTDQ2PS   ymm0, ymm0     ; convert to packed float

解决方案 2:结合广播加载和洗牌

此策略涉及执行 128 位广播加载以产生 64 位洗牌控制向量对于 vpshufb,允许零扩展和压缩浮点转换。它通过消除额外的随机指令的需要来提供高吞吐量。

VPMOVSXBD   xmm0,  [rsi]   ; Byte to DWord
VPMOVSXBD   xmm1,  [rsi+4] 
VINSERTF128 ymm0, ymm0, xmm1, 1   
VCVTDQ2PS   ymm0, ymm0     ; convert to packed float.

解决方案 3:处理 AVX1 限制

在没有 AVX2 的情况下,以下步骤可以使用:

VPMOVZXBD   xmm0,  [rsi]
VPMOVZXBD   xmm1,  [rsi+4]
VINSERTF128 ymm0, ymm0, xmm1, 1   ; put the 2nd load of data into the high128 of ymm0
VCVTDQ2PS   ymm0, ymm0     ; convert to packed float.

附加说明:

  • 考虑使用 VPADDQ 而不是 VCVTDQ2PS 来进一步增强性能。
  • 谨慎不同语言的潜在编译器优化。
  • 请参阅解决方案中链接的特定资源以获取更多见解。

以上是如何将 8 个字符从内存加载到 __m256 变量中:三种有效方法的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn