gpt4 book ai didi

c++ - 设置并检查32位变量

转载 作者:太空狗 更新时间:2023-10-29 20:23:02 25 4
gpt4 key购买 nike

我想知道是否在检查后设置32位变量比设置变量要快?例如。变量a是uint32

if( a != 0)
{
a = 0;
}

或者
a = 0;

该代码将在一个循环中运行,它将运行很多次,因此我想减少运行代码的时间。
注意变量a在大多数情况下将为0,因此可以将问题简化为检查或设置32位变量是否更快。先感谢您!

编辑:谢谢所有对此问题发表评论的人,我创建了一个for循环并测试了分配和if-ing十万次。事实证明,分配速度更快(if-ing为54毫秒,分配为44毫秒)

最佳答案

您所描述的称为“静默存储”优化。

优点:避免不必要的存储。

这可以减轻存储上加载转发缓冲区的压力,这是现代乱序CPU的一个组成部分,在硬件上非常昂贵,因此通常尺寸过小,因此成为性能瓶颈。在Intel x86 CPU上,可以使用性能事件监视计数器(EMON)来调查程序中是否存在问题。

有趣的是,它还可以减少程序执行的负载数量。首先,SW:如果不消除存储,编译器可能无法证明不写入由另一个变量占用的内存,即所谓的地址和指针歧义消除问题,因此编译器可能会生成不必要的重载这样可能但实际上并不冲突的内存位置。取消商店,其中一些loD也可能被取消。其次,硬件:大多数现代CPU都有存储到加载相关性预测变量:更少的存储可提高准确性。如果预测到依赖关系,则负载实际上可能不是由硬件执行的,可能会转换为寄存器以进行寄存器移动。这是威斯康星大学最近对英特尔和苹果提起的专利诉讼的主题,赔偿金超过数亿美元。

但是,消除不必要的存储区的最重要原因是避免不必要地弄脏缓存。脏的高速缓存行最终必须写入内存,即使它保持不变。浪费的力量。在许多系统中,最终将它们写入闪存或SSD,这会浪费功率并消耗设备的有限写入周期。

这些考虑激发了诸如http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.28.8947&rep=rep1&type=pdf之类的无声存储的学术研究。但是,通过Google学者的快速搜索显示,这些论文主要是2000年至2004年,我知道没有现代的CPU实现真正的静默存储消除-实际上让硬件读取了旧值。但是,我怀疑缺少这种无声部署的原因使我们陷入困境,主要是因为随着重点从台式机转向手机,CPU设计暂停了十多年。现在,手机几乎已经 catch 了2000年代台式机CPU的先进水平,这种情况可能会再次出现。

缺点:消除软件中的静默存储需要更多说明。更糟糕的是,它需要一个分支。如果分支不是非常可预测的,那么导致的分支错误预测将消耗任何节省的资源。有些机器上的指令允许您消除不带分支的此类存储:例如,英特尔的带有条件 vector 掩码的LRBNI vector 存储指令。我相信AVX有这些说明。如果您或您的编译器可以使用这样的指令,那么代价就是旧值的加载,如果旧值已经在寄存器中,则 vector 比较就是 vector ,然后只是比较。

顺便说一下,您可以在不完全消除商店的情况下获得一些好处,而只需将其重定向到安全地址即可。相反,如果

如果a [i]!= 0,则a [i]:= 0



ptr = a + I;如果* ptr == 0,则ptr.:=&safe; * ptr:= 0

仍在进行存储,但不会弄脏许多高速缓存行。如果大量伪造条件存储指令,我就用这种方式。编译器执行这种优化的可能性很小。

因此,不幸的是,答案是“取决于”。如果您使用的是 vector 蒙版计算机或GPU,则静默存储非常普遍,例如超过30%,值得考虑。如果在标量代码中,可能需要90%以上的静音。

理想情况下,请自己进行测量。尽管很难进行实际的测量。

我将从最优化的最佳情况开始:

字符a [1024 * 1024 * 1024];//零填充
const int cachelinesize = 64;
为(char * p = a; p

这里消除了每个存储区-请确保编译器仍然发出它们。良好的分支预测等

如果此限制条件没有任何好处,那么您的实际代码将不太可能。

来考虑一下是否可以,我在上个世纪就有了这样的基准。静默存储代码的速度提高了2倍,因为它完全限制了内存,并且静默存储在回写式高速缓存中不生成任何脏高速缓存行。因此,请重新检查,然后尝试更实际的工作量。

但是首先,请测量您是否存在内存瓶颈。

顺便说一句:如果静默存储消除的硬件实现变得很普遍,那么您将永远不想在软件中实现它。

但是目前,我知道在市售的CPU中没有消除静默存储的硬件实现。

随着ECC变得越来越普遍,静默存储消除几乎是免费的-因为在许多情况下,无论如何您都必须读取旧字节来重新计算ECC。

关于c++ - 设置并检查32位变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35051075/

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