" 缓存不友好代码 "和" 缓存友好 "代码之间有什么区别?
如何确保编写高效缓存代码?
在大多数处理器中,为什么L1缓存的大小小于L2缓存的大小?
我的任务是开发一个测试软件,在一台 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) 我们知道缓存使用虚拟地址.那么,当涉及多个进程时,这是如何工作的,特别是对于共享高速缓存,例如共享二级高速缓存,甚至是本地L1高速缓存,当切换进程时,如同时(超级)多线程一样,你可以有线程来自在同一物理核心上运行的两个不同进程.当涉及来自不同进程的线程时,超线程是否有任何好处,或者它是否只能在涉及相同进程的线程时提高性能?
超线程技术是英特尔推出的一种同步多线程技术.
这些资源包括执行引擎,缓存和系统总线接口; 资源共享允许两个逻辑处理器更有效地相互协作,并允许停滞的逻辑处理器从另一个逻辑处理器借用资源.
在具有超线程的Intel CPU中,一个CPU内核(具有多个ALU)可以在同一时钟执行来自2个线程的指令.两个线程共享:存储缓冲区,缓存L1/L2和系统总线.
但是如果两个线程在一个Core上同时执行,则thread-1存储原子值,而thread-2加载此值,将用于此交换的内容:共享存储缓冲区,共享缓存L1/L2还是通常的缓存L3?
如果两个线程来自同一个进程(相同的虚拟地址空间)和两个不同进程(不同的虚拟地址空间),会发生什么?
Sandy Bridge Intel CPU - 缓存L1:
低12位 - 对于确定当前设定数值很重要
4 KB - 标准页面大小
caching ×3
x86 ×3
cpu-cache ×2
memory ×2
c ×1
c++ ×1
concurrency ×1
linux ×1
linux-kernel ×1
performance ×1
processor ×1
sockets ×1
x86-64 ×1