相关疑难解决方法(0)

如何从C程序中刷新Linux中的CPU缓存?

我正在写一个C程序,我需要冲洗我的记忆.我想知道是否有任何UNIX系统命令来刷新CPU缓存.

这是我的项目的一项要求,它涉及计算我的逻辑所需的时间.

我已经阅读了有关该cacheflush(char *s, int a, int b)功能的内容,但我不确定它是否合适以及在参数中传递什么.

c unix linux caching flush

9
推荐指数
3
解决办法
3万
查看次数

从OS /应用程序分析CPU高速缓存/内存?

我希望编写的软件本质上可以分析CPU缓存(L2,L3,可能是L1)和内存,以分析性能.

我认为这是不可行的,因为软件无法访问缓存内容吗?

另一种措辞我的问:有什么方法可以从操作系统/应用程序级别知道哪些数据已加载到缓存/内存中?

编辑:操作系统Windows或Linux和CPU Intel Desktop/Xeon

linux windows cpu caching

8
推荐指数
2
解决办法
5823
查看次数

对两个连续测量进行基准测试时不一致

我在对一个函数进行基准测试时,发现某些迭代比其他迭代慢。

经过一些测试后,我尝试对两个连续的测量进行基准测试,但仍然得到一些奇怪的结果。

代码在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处理器上

我是计算机上的唯一用户,我尝试在没有优先级(nicechrt)的情况下运行,结果是相同的。

我经过1亿次迭代得到的结果是:

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++ linux performance caching performance-testing

8
推荐指数
1
解决办法
500
查看次数

快速计算C程序中执行的指令数

有没有一种简单的方法可以在执行C程序时快速计算执行的指令数量(x86指令 - 每个指令的数量和数量)?

gcc version 4.7.1 (GCC)x86_64 GNU/Linux机器上使用.

c linux profile

7
推荐指数
2
解决办法
8124
查看次数

插入排序比shell排序快得多

我正在阅读关于在Sedgewick的"算法"中进行排序的章节.在此过程中,我编写了3种基本排序算法:选择,插入和shell排序.该书说,尽管所有三个都具有二次最坏情况复杂性,但shell排序应该比随机数据上的插入排序快得多.在本书中,他们获得了600倍的性能提升.

但是我的笔记本电脑上有以下乘法器(几乎不随数组大小的增加而改变):

  • 选择:5.5x
  • 插入:1x
  • 外壳:1.8倍!

困扰我的问题是 - 为什么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)

java sorting algorithm performance shellsort

6
推荐指数
1
解决办法
1300
查看次数

如何检测错误共享会降低性能?

我正在调整一个高性能的多线程应用程序,我怀疑虚假共享可能是导致性能不佳的原因.我如何验证是否是这种情况?

我正在使用gcc 4.82在Ubuntu 12.04上运行C++.

c++ concurrency performance multithreading

5
推荐指数
2
解决办法
913
查看次数

代码执行因标头包含而减慢

我们这里有一个非常大的程序,它混合了C++和FORTRAN(对不起).我的一次签到导致整个应用程序急剧减速(即两倍或更多) - 即使在代码中不受我的更改影响的区域也是如此.

事实:

  1. 几乎每个模块都减慢了相似的数量 - 甚至是那些不使用我的代码的模块.

  2. 可执行文件大约增加6%.

  3. 签入之间未更改元数据.

  4. IDE /编译器处于发布模式的VS2010.

  5. 一些.lib文件的大小增加了一倍或三倍.

我看了一个大小增加了三倍的.lib文件,只有两个变化:

a)我已经包含了一个大型的头文件,而该文件又包含许多其他文件 - 其中一些包含中等复杂的内联代码."附加包含目录"已经从非一个或一个变为大约7个,因为每个头文件#include一个或多个其他头文件.

b)我从这个头文件中调用了4个函数,但是这些函数在运行期间没有被调用(即它们的执行不能减慢代码速度,但可能会包含它们).

尽管在论坛中搜索包含头文件是否会减慢执行速度(而不是编译),但我找不到一篇相关的文章.我的问题是:

任何形式的头文件(声明或内联)的#inclusion是否会减慢代码执行速度?

内联代码的执行速度是否存在定性或定量差异(我知道'内联'只是对编译器的建议)?

?.lib大小,.exe大小和执行速度之间有什么相关性(我期待这里有很多不同且相互矛盾的相关性)?

?将重构一些头文件,以便他们不需要包含其他文件(通过将这些包含放入.cpp文件,从而减少我的'其他包含目录')改善我的情况,你觉得呢?

我想最后一个问题是问题的关键,因为它需要付出很多努力......

c++ linker profiling compiler-optimization

3
推荐指数
1
解决办法
1538
查看次数