概要
关于低延迟相关技术,需要我们掌握cpu cache工作原理、kernel bypass、非阻塞编程、编译优化、硬件优化( CPU pipelines,FPGA)、软件优化(高效算法和数据结构)
CPU Caches
Cacheline(缓存行):内存与缓存的交互总是以cachelline大小进行拷贝。比如:cpu传输一个整型变量时(4或8字节),采用的是一个cacheline大小(主流cpu是64字节)进行传输,可以理解cacheline为最小缓存单位。
缓存的类型:指令缓存(程序指令),数据缓存(程序数据),虚拟内存与物理内存的映射缓存。
缓存等级:cpu寄存器 -> L1缓存 -> L2 缓存 -> L3缓存 -> 主存, 越靠近cpu寄存器的位置速度越快。
缓存一致性:对在不同的缓存和主存之间的数据一致性处理。
时间局部性 Temporal Locality:指最近使用的数据更有可能再被使用。
空间局部性 Spatial Locality:如果内存中某个位置的数据正在被cpu所使用,那么靠近这个内存位置的内存数据很可能在不久的将来被引用。
缓存预热 :当数据第一次被cpu引用时,数据被从主存放置到缓存中。缓存预热是为了增加缓存命中,而预测即将使用的数据并把其加载到缓存中。
**CPU 绑定,pinning **: 指将进程和某个或者某几个 CPU 关联绑定,绑定后的进程只能在所关联的 CPU 上运行,可提高缓存命中率。
Q1 分析代码段性能
分别采用行、列访问数据的方式:
// row major order
std::vector<double> v(n * n);
double sum{
0.0};
for (std::size_t i = 0; i < n; i++) {
for (std::size_t j = 0; j < n ; j++) {
sum += v[i * n + j];
}
}
// column major order
std::vector<double> v(n * n);
double sum{
0.0};
for (std::size_t j = 0; j < n; j++) {
for (std::size_t i = 0; i < n ; i++) {
sum += v[i * n + j]