草庐IT

c++ - 缓存未命中的代价是什么

我正在分析一些代码并使用cachegrind来获取执行中的缓存未命中数(L2和L3)。我的问题是如何根据缓存未命中确定等待缓存准备就绪所花费的时间?我希望能够说“我的代码获得90%的CPU使用率”之类的话是否可以根据缓存研磨输出来执行此操作? 最佳答案 Cachegrind只是模拟CPU上的执行,模拟缓存和分支预测器的行为方式。要知道您将在缓存上阻塞多长时间,需要更多信息。具体来说,您需要知道何时可以推测执行以及可以并行分派(dispatch)多少指令(以及如何同时协调内存内存访问)。Cachegrind无法做到这一点,任何可能严重

c++ - 用perf和papi测量L1数据缓存未命中

papi中的PAPI_L1_LDM和perf中的L1-dcache-load-misses有什么区别?我使用了相同的设置,比如thisposthere。所以,结果我得到了爸爸:PAPI_L1_DCM:515很遗憾,此计算机不支持PAPI_L1_DCA。对于perf(仅在用户空间中,因为papi也只测量用户空间而不测量内核空间):调用:perfstat-B-eL1-dcache-load-misses:u,cache-misses:u./perf16,539L1-dcache-load-misses128cache-misses:u16539对于N=1000000似乎更为合理。加载数据未

c++ - 减少指令缓存未命中(在 C++ 中)

假设我有一个C++类,其实现如下所示://...MyClass::iterativeFunction(){for(inti=0;i在C++级别,我是否可以控制这些方法的空间局部性,或者我是否只能希望编译器注意到相关方法并相应地优化其汇编?理想情况下,我希望它们紧挨着彼此,这样它们将一起加载到指令缓存中,但我不知道如何让编译器知道我真的希望这种情况发生。 最佳答案 在任何一种情况下,代码在进入缓存之前都无法运行。在任何一种情况下,对于CPU来说,代码流的去向都同样显而易见,因为该流是无条件的。所以这不会有任何区别。现代代码缓存不会在地

c++ - 如何根据命中的另一个断点添加条件中断?视觉C++

我有一堆经常使用的通用代码,我想深入研究这些代码以处理特定情况下的错误。所以我只想在遇到其他断点时中断一组断点。有没有办法在Visual2005中执行此操作?我正在使用C++代码。谢谢! 最佳答案 请记住,您可以禁用断点-仅禁用第二个断点可能更容易/更高效/更清洁(例如,然后将调试标志添加到您的代码并重新编译),等到第一个断点,然后启用第二个在你的断点窗口中-每次调试时只需点击两次鼠标......:) 关于c++-如何根据命中的另一个断点添加条件中断?视觉C++,我们在StackOver

c++ - 由于引用计数器原子递增/递减,shared_ptrs 是否会遇到缓存未命中?

(这可能是原子递增/递减的一般问题,但我在shared_ptrs领域遇到过这种情况)当原子引用计数器递增和递减时,shared_ptr是否遇到两次缓存行未命中/访问?我确实找到了这个:atomicoperationcost但它似乎并没有过于确定......更新:如果我运行一个循环数百万次,递增一个原子变量,我得到的L1缓存未命中率为0.2。如果我对非原子int做同样的事情,我会得到0L1缓存未命中率......测试将暗示L1缓存行正在被逐出。 最佳答案 shared_ptr必须在某处存储引用计数变量。它可能是从堆中分配的,并且sha

c++ - 高效缓存和 BLOB - 分析缓存命中/未命中

对于缓存高效的程序,所使用的数据应该线性存储,对吗?因此,我使用线性分配器将数据放入blob中,而不是动态分配。这足以提高性能吗?我应该怎么做才能进一步提高缓存效率?我知道这个问题并不具体,但我不知道如何解释...哪些程序可以帮助我分析缓存命中/未命中? 最佳答案 如果您正在寻找适用于Windows的分析器,您可以尝试AMD'sCodeAnalyst或VerySleepy,这两者都是免费的,AMD是两者中更强大的(并且可以在英特尔硬件上工作,但iirc你不能使用基于硬件的分析工具),它包括监控分支预测未命中和缓存利用率等内容。分析很

c++ - std::vector 中的每个元素访问都是缓存未命中吗?

众所周知,std::vector将其数据保存在堆上,因此vector本身的实例和第一个元素具有不同的地址。另一方面,std::array是原始数组的轻量级包装器,其地址等于第一个元素的地址。让我们假设集合的大小足以容纳int32的一个缓存行。在我有384kBL1缓存的机器上它是98304个数字。如果我迭代std::vector,我总是首先访问vector本身的地址,然后访问下一个元素的地址。并且可能这个地址不在同一个缓存行中。所以每次元素访问都是缓存未命中。但如果我迭代std::array地址在同一个缓存行中,那么它应该更快。我用VS2013进行了全面优化测试,std::array快了

c++ - 使用 valgrind 测量缓存未命中

关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭7年前。Improvethisquestion我有一个关键路径,它在一个线程中执行,固定到一个核心。我有兴趣确定发生缓存未命中的位置。环顾四周后,valgrind的cachegrind工具似乎对我有帮助。但是,我对该工具在这种情况下的功能有一些疑问:提供的缓存未命中位置有多具体?是否输出变量名?我可以只介绍一个话题吗?是否可以分析代码的特定部分?所有用于测量缓存未命中的功能,它们是否同样适用于TLB未命中?我可以将cachegrind与我的发布/优化

c++ - 不会命中 Visual Studio 2015 c++ 断点

您好,我在visualstudio2015中有一个C++应用程序。我的.exe的pdb无法工作,它无法命中断点。当我打开模块窗口时,状态显示不支持符号格式。我的调试文件标志在项目设置中是/ZI。我试过删除object和bin文件夹。当我创建一个新项目时,它遇到了断点。有什么想法吗? 最佳答案 我已经检查了使用托管兼容模式和使用native兼容模式。取消选中使用native兼容模式修复它。 关于c++-不会命中VisualStudio2015c++断点,我们在StackOverflow上找

c++ - Cachegrind:为什么有这么多缓存未命中?

我目前正在学习Linux下的各种分析和性能实用程序,尤其是valgrind/cachegrind。我有以下玩具程序:#include#includeintmain(){constunsignedintCOUNT=1000000;std::vectorv;for(inti=0;i用g++-O2-gmain.cpp编译这个程序并运行valgrind--tool=cachegrind./a.out,然后cg_annotatecachegrind。out.31694--auto=yes产生以下结果:------------------------------------------------