相关疑难解决方法(0)

什么是"缓存友好"代码?

" 缓存不友好代码 "和" 缓存友好 "代码之间有什么区别?

如何确保编写高效缓存代码?

c++ memory performance caching cpu-cache

703
推荐指数
7
解决办法
14万
查看次数

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

从未初始化的缓冲区复制比从初始化的缓冲区复制要快得多

我的任务是开发一个测试软件,在一台 32GB RAM 的机器上的 Linux(X86-64,内核 4.15)上通过 1 个 TCP 套接字生成 100Gbps 的流量。

我开发了类似以下代码(为了简单起见,删除了一些健全性检查)来在一对 veth 接口(其中一个位于不同的 netns 中)上运行。

bmon根据开源软件,它在我的 PC 上生成大约 60Gbps 。令我惊讶的是,如果我删除该语句memset(buff, 0, size);,我会得到大约 94Gbps。这非常令人费解。

void test(int sock) {
    int size = 500 * 0x100000;
    char *buff = malloc(size);
    //optional
    memset(buff, 0, size);
    int offset = 0;
    int chunkSize = 0x200000;
    while (1) {
        offset = 0;
        while (offset < size) {
            chunkSize = size - offset;
            if (chunkSize > CHUNK_SIZE) chunkSize = CHUNK_SIZE;
            send(sock, &buff[offset], chunkSize, …
Run Code Online (Sandbox Code Playgroud)

c sockets linux x86 linux-kernel

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

缓存可以保存来自多个进程的数据吗?

我们知道缓存使用虚拟地址.那么,当涉及多个进程时,这是如何工作的,特别是对于共享高速缓存,例如共享二级高速缓存,甚至是本地L1高速缓存,当切换进程时,如同时(超级)多线程一样,你可以有线程来自在同一物理核心上运行的两个不同进程.当涉及来自不同进程的线程时,超线程是否有任何好处,或者它是否只能在涉及相同进程的线程时提高性能?

x86 multithreading caching multiprocessing

4
推荐指数
1
解决办法
459
查看次数

用于线程之间数据交换的内容是在一个Core上用HT执行的?

超线程技术是英特尔推出的一种同步多线程技术.

这些资源包括执行引擎,缓存和系统总线接口; 资源共享允许两个逻辑处理器更有效地相互协作,并允许停滞的逻辑处理器从另一个逻辑处理器借用资源.

在具有超线程的Intel CPU中,一个CPU内核(具有多个ALU)可以在同一时钟执行来自2个线程的指令.两个线程共享:存储缓冲区,缓存L1/L2和系统总线.

但是如果两个线程在一个Core上同时执行,则thread-1存储原子值,而thread-2加载此值,将用于此交换的内容:共享存储缓冲区,共享缓存L1/L2还是通常的缓存L3?

如果两个线程来自同一个进程(相同的虚拟地址空间)和两个不同进程(不同的虚拟地址空间),会发生什么?

Sandy Bridge Intel CPU - 缓存L1:

  • 32 KB - 缓存大小
  • 64 B - 缓存行大小
  • 512 - 行(512 = 32 KB/64 B)
  • 8路
  • 64 - 数组方式(64 = 512行/ 8路)
  • 6位[11:6] - 虚拟地址(索引)定义当前集合号(这是标记)
  • 4 K - 每个相同(虚拟地址/ 4 K)竞争同一组(32 KB/8路)
  • 低12位 - 对于确定当前设定数值很重要

  • 4 KB - 标准页面大小

  • 低12位 -每个地址的虚拟和物理地址相同

在此输入图像描述

concurrency x86 multithreading x86-64 hyperthreading

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