首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >AVX指令中寄存器和指针的客观区别

AVX指令中寄存器和指针的客观区别
EN

Stack Overflow用户
提问于 2018-10-09 07:13:42
回答 1查看 150关注 0票数 0

场景:您正在使用SIMD编写一个复杂的算法。使用少量常量和/或不频繁更改的值。最终,该算法使用了超过16个ymm,导致使用堆栈指针(例如,操作码包含vaddps ymm0,ymm1,ymmword ptr [...]而不是vaddps ymm0,ymm1,ymm7)。

为了使算法适合可用寄存器,可以对常量进行“内联”。例如:

代码语言:javascript
复制
const auto pi256{ _mm256_set1_ps(PI) };
for (outer condition)
{
    ...
    const auto radius_squared{ _mm256_mul_ps(radius, radius) };
    ...
    for (inner condition)
    {
        ...
        const auto area{ _mm256_mul_ps(radius_squared, pi256) };
        ...
    }
}

..。变成了..。

代码语言:javascript
复制
for (outer condition)
{
    ...
    for (inner condition)
    {
        ...
        const auto area{ _mm256_mul_ps(_mm256_mul_ps(radius, radius), _mm256_set1_ps(PI)) };
        ...
    }
}

无论所讨论的一次性变量是常量,还是不经常计算(计算的外部循环),如何确定哪种方法实现最佳吞吐量?是不是像"ptr增加了2个额外的延迟“这样的概念问题?或者它是不确定的,以至于它在案例的基础上是不同的,并且只能通过试错+分析来完全优化?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-09 07:36:41

一个好的优化编译器应该为两个版本生成相同的机器码。只需将向量常量定义为局部变量,或者匿名使用它们以获得最大的可读性;让编译器担心寄存器分配,并在发生这种情况时选择成本最低的方法来处理寄存器耗尽的问题。

帮助编译器的最好办法是尽可能少使用不同的常量。例如,同时使用set1_epi16(0x00FF)0xFF00而不是_mm_and_si128,使用_mm_andn_si128来掩码另一种方式。您通常不能做任何事情来影响它选择将哪些内容保存在寄存器中,但幸运的是,编译器在这方面做得很好,因为这对于标量代码也是必不可少的。

编译器会将常量提升到循环之外(甚至内联包含常量的辅助函数),或者如果只在分支的一侧使用,则将设置带到分支的那一侧。

源代码计算的结果完全相同,没有明显的副作用,因此as-if规则允许编译器自由地执行此操作。

我认为编译器通常会在执行CSE (公共子表达式消除)并识别可提升的循环不变量和常量之后,进行寄存器分配并选择溢出/重载(或仅使用只读向量常量)。

当它发现它没有足够的寄存器来将所有变量和常量保存在循环内的regs中时,不能保存在寄存器中的东西的第一选择通常是循环不变向量,要么是编译时常量,要么是在循环之前计算的东西。

在L1d缓存中命中的额外负载比在循环中存储(也称为溢出)/重新加载变量更便宜。因此,无论您将定义放在源代码中的什么位置,编译器都会选择从内存中加载常量。

用C++编写的部分意义在于,您有一个编译器来为您做出这个决定。因为它被允许为两个源做相同的事情,所以做不同的事情将是一个错过的优化,至少对于其中一个情况。(在任何特定情况下,最好的做法取决于周围的代码,但通常使用向量常量作为内存源操作数,当编译器在regs上运行较低时是可以的。)

是不是像"ptr增加了2个额外的延迟“这样的概念问题?

内存源操作数的微融合不会延长从非常数输入到输出的关键路径。一旦地址准备就绪,加载uop就可以开始,对于向量常量,它通常是RIP-relative或[rsp+constant]寻址模式。因此,通常,一旦向内核的乱序部分发出加载命令,就可以立即执行加载。假设L1d缓存命中(因为如果每次循环迭代都加载它,它将在缓存中保持热),这只有大约5个周期,所以如果向量寄存器输入上存在依赖性链瓶颈,它将很容易及时准备就绪。

它甚至不会影响前端吞吐量。除非您遇到负载端口吞吐量的瓶颈(在现代x86 CPU上,每个时钟有2个负载),否则通常没有区别。(即使使用高度精确的测量技术。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52711237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档