- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想知道是否在检查后设置32位变量比设置变量要快?例如。变量a是uint32
if( a != 0)
{
a = 0;
}
a = 0;
最佳答案
您所描述的称为“静默存储”优化。
优点:避免不必要的存储。
这可以减轻存储上加载转发缓冲区的压力,这是现代乱序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/
这个问题已经有答案了: Is there any way to accept only numeric values in a JTextField? (20 个回答) It's possible i
我使用戴尔 XPS M1710。笔记本电脑的盖子、侧面扬声器和前置扬声器都有灯(3 组灯可以单独调节)和鼠标垫下方的灯。在 BIOS 中,我可以更改这些灯的颜色,至少是每个组。另外,我可以在鼠标垫下打
我知道我可以使用 在 iOS 5 中打开设置应用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"
我有一个 Django 应用程序,我正在尝试为其设置文档。目录结构如下: - doc - project | - manage.py 我已经设置了路径以便 Sphinx 可以看到东西,但是当我尝试使用
我正在使用 768mb ram 运行 centos 5.5。我一直在日志中获取 server reached MaxClients setting, consider raising the MaxC
我在具有以下配置的服务器内运行了 Drupal 安装: StartServers 5 MinSpareServers 5 MaxSpareServers 15 MaxClien
是否可以使用 Microsoft.Web.Administration 包为给定的 location 配置 asp 设置? 我想以编程方式将以下部分添加到本地 IIS applicationHost.
我一直在阅读为 kube-proxy 提供参数的文档,但没有解释应该如何使用这些参数。我使用 az aks create 创建我的集群使用 azure-cli 程序,然后我获得凭据并使用 kubect
我想知道与在 PHP 中使用 setcookie() 函数相比,在客户端通过 JavaScript 设置一些 cookie 是否有任何明显的优势?我能想到的唯一原因是减少一些网络流量(第一次)。但不是
我有一个按钮可以将 body class 设置为 .blackout 我正在使用 js-cookie设置cookie,下面的代码与我的按钮相关联。 $('#boToggle').on('click'
我有一堆自定义的 HTML div。我将其中的 3 存储在具有 slide 类的 div 中。然后,我使用该幻灯片类调用 slick 函数并应用如下设置: $('.slide').slick({
我正在创建一个应该在 Windows 8(桌面)上运行的应用 我需要: 允许用户使用我的应用启动“文件历史记录”。我需要找到打开“文件历史记录”的命令行。 我需要能够显示“文件历史记录”的当前设置。
我刚买了一台新的 MacBook Pro,并尝试在系统中设置 RVM。我安装了 RVM 并将默认设置为 ➜ rvm list default Default Ruby (for new shells)
由于有关 Firestore 中时间戳行为即将发生变化的警告,我正在尝试更改我的应用的初始化代码。 The behavior for Date objects stored in Firestore
在 ICS 中,网络 -> 数据使用设置屏幕中现在有“限制后台数据”设置。 有没有办法以编程方式为我的应用程序设置“限制后台数据”? 或 有没有办法为我的应用程序调出具有选项的“数据使用”设置? 最佳
我正在尝试使用 NextJS 应用程序设置 Jest,目前在 jest.config.js : module.exports = { testPathIgnorePatterns: ["/.n
我最近升级到 FlashDevelop 4,这当然已经将我之前的所有设置恢复到原来的状态。 我遇到的问题是我无法在新设置窗口的哪个位置找到关闭它在方括号、大括号等之前插入的自动空格的选项。 即它会自动
有没有办法以编程方式访问 iPhone/iPod touch 设置? 谢谢。比兰奇 最佳答案 大多数用户设置可以通过读取存储在 /User/Library/Preferences/ 中的属性列表来访问
删除某些值时,我需要选择哪些设置来维护有序队列。我创建了带有自动增量和主键的 id 的表。当我第一次插入值时,没问题。就像 1,2,3,4,5... 当删除某些值时,顺序会发生变化,例如 1,5,3.
我正在尝试设置示例 Symfony2 项目,如此处所示 http://symfony.com/doc/current/quick_tour/the_big_picture.html 在访问 confi
我是一名优秀的程序员,十分优秀!