我正在写一个C程序,我需要冲洗我的记忆.我想知道是否有任何UNIX系统命令来刷新CPU缓存.
这是我的项目的一项要求,它涉及计算我的逻辑所需的时间.
我已经阅读了有关该cacheflush(char *s, int a, int b)功能的内容,但我不确定它是否合适以及在参数中传递什么.
我希望编写的软件本质上可以分析CPU缓存(L2,L3,可能是L1)和内存,以分析性能.
我认为这是不可行的,因为软件无法访问缓存内容吗?
另一种措辞我的问:有什么方法可以从操作系统/应用程序级别知道哪些数据已加载到缓存/内存中?
编辑:操作系统Windows或Linux和CPU Intel Desktop/Xeon
我在对一个函数进行基准测试时,发现某些迭代比其他迭代慢。
经过一些测试后,我尝试对两个连续的测量进行基准测试,但仍然得到一些奇怪的结果。
代码在wandbox上。
对我来说重要的是:
using clock = std::chrono::steady_clock;
// ...
for (int i = 0; i < statSize; i++)
{
auto t1 = clock::now();
auto t2 = clock::now();
}
Run Code Online (Sandbox Code Playgroud)
正如我们在Godbolt上看到的那样,该循环已被优化。
call std::chrono::_V2::steady_clock::now()
mov r12, rax
call std::chrono::_V2::steady_clock::now()
Run Code Online (Sandbox Code Playgroud)
该代码使用以下代码进行编译:
g++ bench.cpp -Wall -Wextra -std=c++11 -O3
Run Code Online (Sandbox Code Playgroud)
并gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)安装在英特尔®至强®W-2195处理器上。
我是计算机上的唯一用户,我尝试在没有优先级(nice或chrt)的情况下运行,结果是相同的。
我经过1亿次迭代得到的结果是:
Y轴以纳秒为单位,是线的结果
std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count()
Run Code Online (Sandbox Code Playgroud)
这4行让我想到:没有缓存/ L1 / L2 / L3缓存未命中(即使“ L3缓存未命中”行似乎与L2行距离太近)
我不确定为什么会出现缓存未命中,可能是结果的存储,但是它不在测量的代码中。
我已尝试使用1500循环运行10000次程序,因为此处理器的L1缓存为: …
有没有一种简单的方法可以在执行C程序时快速计算执行的指令数量(x86指令 - 每个指令的数量和数量)?
我gcc version 4.7.1 (GCC)在x86_64 GNU/Linux机器上使用.
我正在阅读关于在Sedgewick的"算法"中进行排序的章节.在此过程中,我编写了3种基本排序算法:选择,插入和shell排序.该书说,尽管所有三个都具有二次最坏情况复杂性,但shell排序应该比随机数据上的插入排序快得多.在本书中,他们获得了600倍的性能提升.
但是我的笔记本电脑上有以下乘法器(几乎不随数组大小的增加而改变):
困扰我的问题是 - 为什么shell排序几乎比插入排序慢两倍?!
我想,我的shellort实现有问题.但我几乎从书中复制了它:
class ShellSort extends Sort {
//precalculate sequence: 1, 4, 13, 40, 121, 364, 1093, ...
//(3^20 - 1)/2 is enough for any array I sort
private static final int[] SEQUENCE = new int[20];
static {
for(int i = 1; i <= SEQUENCE.length; i++)
SEQUENCE[i - 1] = (int)(Math.pow(3, i) - 1) / 2;
}
public void sort(int[] a) {
int length = a.length;
int seqLen = SEQUENCE.length;
int nth;
int j; …Run Code Online (Sandbox Code Playgroud) 我正在调整一个高性能的多线程应用程序,我怀疑虚假共享可能是导致性能不佳的原因.我如何验证是否是这种情况?
我正在使用gcc 4.82在Ubuntu 12.04上运行C++.
我们这里有一个非常大的程序,它混合了C++和FORTRAN(对不起).我的一次签到导致整个应用程序急剧减速(即两倍或更多) - 即使在代码中不受我的更改影响的区域也是如此.
事实:
几乎每个模块都减慢了相似的数量 - 甚至是那些不使用我的代码的模块.
可执行文件大约增加6%.
签入之间未更改元数据.
IDE /编译器处于发布模式的VS2010.
一些.lib文件的大小增加了一倍或三倍.
我看了一个大小增加了三倍的.lib文件,只有两个变化:
a)我已经包含了一个大型的头文件,而该文件又包含许多其他文件 - 其中一些包含中等复杂的内联代码."附加包含目录"已经从非一个或一个变为大约7个,因为每个头文件#include一个或多个其他头文件.
b)我从这个头文件中调用了4个函数,但是这些函数在运行期间没有被调用(即它们的执行不能减慢代码速度,但可能会包含它们).
尽管在论坛中搜索包含头文件是否会减慢执行速度(而不是编译),但我找不到一篇相关的文章.我的问题是:
?任何形式的头文件(声明或内联)的#inclusion是否会减慢代码执行速度?
?内联代码的执行速度是否存在定性或定量差异(我知道'内联'只是对编译器的建议)?
?.lib大小,.exe大小和执行速度之间有什么相关性(我期待这里有很多不同且相互矛盾的相关性)?
?将重构一些头文件,以便他们不需要包含其他文件(通过将这些包含放入.cpp文件,从而减少我的'其他包含目录')改善我的情况,你觉得呢?
我想最后一个问题是问题的关键,因为它需要付出很多努力......