DPDK的Cache预取和Cache一致性

1.什么是Cache预取

       众所周知,CPU访问Cache中的数据是比访问内存中的数据是要快的,而因为程序都有时间局部性和空间局部性,时间局部性简单来说就是某一条或几条指令在一段时间内会被CPU多次执行;空间局部性简单来说就是某一段数据块中的数据会被CPU多次访问。像这样的会被CPU多次执行和访问的指令和数据,将其放在Cache中,会提高CPU执行程序速度。Cache预取就是在这样的背景下诞生的。

       而Cache预取又分为硬件预取和软件预取。
       关于硬件预取,举一个例子:

// 程序1:
for (int i = 0; i < 1024; i++) {for (int j = 0; j < 1024; j++) {arr[i][j] = num++;}
}
// 程序2:
for (int i = 0; i < 1024; i++) {for (int j = 0; j < 1024; j++) {arr[j][i] = num++;}
}

       程序1是按照数组在内存中的保存方式顺序访问,而程序2则是跳跃式访问。对于程序1,硬件预取单元能够自动预取接下来需要访问的数据到Cache,节省访问内存的时间,从而提高程序1的执行效率;对于程序2,硬件不能够识别数据访问的规律,因而不会预取,从而使程序2总是需要再内存中读取数据,降低了执行效率。

在这里插入图片描述在这里插入图片描述
       因此,硬件预取单元不一定能够提高程序执行的效率,所以一些体系架构的处理器增加了一些指令,作为软件预取指令。DPDK中也有相关预取函数,如:rte_ixgbe_prefetch(sw_ring[rx_id].mbuf); // 预取下一个控制结构体mbuf
rte_packet_prefetch((char*)rxm->buf_addr + rxm->data_off); // 预取报文
       DPDK必须保证所有需要读取的数据都在Cache中,否则一旦出现Cache不命中,性能将会严重下降。为了保证这一点,DPDK采用了多种技术来进行优化,预取只是其中一种。

3.什么是Cache一致性

       当我们定义了一个数据结构或者分配了一段数据缓冲区之后,在内存中就有一个地址和其相对应,然后程序就可以对它进行都写。对于读,首先是从内存加载到Cache,最后送到处理器内部的寄存器;对于写,则是从寄存器送到Cache,最后通过总线写回内存,这两个过程就引出了两个问题:
       问题1:该数据结构或者数据缓冲区的起始地址是Cache Line对齐的吗?如果不是,即使该数据区域大小小于Cache Line,那么也需要占用两个Cache entry;并且,假设第一个Cache Line前半部分属于另外一个数据结构并且另外一个处理器正在处理它,那么当两个核都修改了该Cache Line从而写回各自一级的Cache,准备送回内存时,如何同步数据?毕竟每个核都只修改了该Cache Line的一部分。

       对于这个问题,一个解决办法就是定义该数据结构或者数据缓冲区时就申明对齐,DPDK对很多结构体定义的时候就是如此操作的。例如:

struct rte_ring_debug_status {uint64_t enq_success_bulk;uint64_t enq_success_objs;uint64_t enq_quota_bulk;uint64_t enq_quota_objs;uint64_t enq_fail_bulk;uint64_t enq_fail_objs;uint64_t deq_success_bulk;uint64_t deq_success_objs;uint64_t deq_fail_bulk;uint64_t deq_fail_objs;
} __rte_cache_aligned;

       __rte_cache_aligned的定义如下所示:

#define RTE_CACHE_LINE_SIZE 64
#define __rte_cache_aligned __attribute((__aligned(RTE_CACHE_LINE_SIZE)))

       问题2:假设该数据结构或者数据缓冲区的起始地址是Cache Line对齐的,但是有多个核同时对该段内存进行读写,当同时对内存进行写回操作时,如何解决冲突?

       对于这个问题,DPDK解决的方案是:避免多个核访问同一个内存地址或者数据结构。这样,每个核尽量都避免与其他核共享数据,从而减少因为错误的数据共享(cache line false sharing)导致的Cache一致性的开销。
以下是两个DPDK为了避免Cache一致性的例子。
       例子1:数据结构定义。DPDK的应用程序很多情况下都需要多个核同时来处理事务,因而,对于某些数据结构,我们给每个核都单独定义一份,这样每个核都只访问属于自己核的备份。如下:

struct lcore_conf {uint16_t n_rx_queue;struct lcore_rx_queue rx_queue_list[MAX_RX_QUEUE_PER_LCORE];uint16_t tx_queue_id[RTE_MAX_ETHPORTS];struct mbuf_table tx_mbufs[RTE_MAX_ETHPORTS];lookup_struct_t * ipv4_lookup_struct;lookup_struct_t * ipv6_lookup_struct;
} __rte_cache_aligned;    // Cache行对齐
struct lcore_conf lcore[RTE_MAX_LCORE] __rte_cache_aligned;

       以上的数据结构“struct lcore_conf”总是以Cache行对齐,这样就不会出现该数据结构横跨两个Cache行的问题。而定义的数组“lcore[RTE_MAX_LCORE]”中RTE_MAX_LCORE指一个系统中最大核的数量。DPDK中对每个核都进行了编号,这样n就只需要访问lcore[n],核m只需要访问lcore[m],这样就避免了多个核访问同一个结构体。

       例子2:对网络端口的访问。在网络平台中,少不了访问网络设备,比如网卡。多核情况下,有可能多个核访问同一个网卡的接收队列/发送队列,也就是在内存中的一段内存结构。这样,也会引起Cache一致性问题。那么DPDK是如何解决这个问题的呢?

       网卡设备一般都具有多队列的能力,也就是说,一个网卡有多个接收队列和多个访问队列。在DPDK中,如果有多个核可能需要同时访问同一个网卡,那么DPDK就会为每个核都准备一个单独的接受队列/发送队列。这样,就避免了竞争,也避免了Cache一致性问题。
       如下图:
在这里插入图片描述
       上图是四个核同时访问两个网络端口(即两个网卡)的图示。其中,网卡1和网卡2都有两个接收队列核四个发送队列;核0到核3每个都有自己的一个接收队列和一个发送队列。核0从网卡1的接收队列0接收数据,可以发送到网卡1的发送队列0或者网卡2的发送队列0;同理,核3从网卡2的接收队列1接收数据,可以发送到网卡1的发送队列3或者网卡2的发送队列3。

       Cache一致性问题最根本的原因是处理器内部不只一个核,当两个或多个核访问内存中同一个Cache行的内容时,就会因为多个Cache同时缓存了该内容引起同步问题。
       而上面DPDK对于问题2的解决办法很好的解决了这个问题。

       文章参考《深入浅出DPDK》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/32042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五十五、openlayers官网示例Loading Spinner解析——给地图添加loading效果,瓦片图层加载时等待效果

官网demo地址&#xff1a; Loading Spinner 这篇介绍了一个非常简单的loading效果 利用地图的loadstart和loadend事件&#xff0c;动态的添加和删除class名。 map.on("loadstart", function () {map.getTargetElement().classList.add("spinner");});map…

Vue72-路由传参1

一、需求 点击哪个消息&#xff0c;就展示哪个消息的详情 这是一个三级路由&#xff01; 给路由组件&#xff1a;detail.vue传递消息数据。 二、代码步骤 2-1、编写路由组件 从$route.query属性里面获取传参 2-2、编写路由规则 2-3、编写路由标签&#xff0c;传参 1、to的字…

Ncorr使用过程的问题解答

问题系列 文章目录 问题系列前言一、如何更改单位&#xff1f;情景&#xff1a;DIC Analysis 二、拉格兰日和欧拉绘图的区别直观 三、控制图像中的显示条上下界限问题展示&#xff1a;解决方案&#xff1a; 更新动态 前言 主要用于记录使用过程中出现的相关问题。 一、如何更改…

数据结构:为什么说链表是顺序表的升级版(c语言实现)

前言&#xff1a; 我们在之前的几篇文章中详细的讲解了顺序表的特点&#xff0c;增删改查操作和动态顺序表的优点&#xff0c;并使用顺序表的底层结构实现了通讯录项目&#xff0c;似乎顺序表是一个非常完美的数据结构&#xff0c;它可以实现按照需求实现增删查改&#xff0c;对…

做好海外ASO优化的7大核心要素你了解几个?

海外App进行ASO优化时&#xff0c;需要综合考虑多个方面以确保应用在应用商店中获得更高的曝光率和下载量。以下是一些关键的ASO优化步骤&#xff0c;结合参考文章中的相关信息进行详细阐述&#xff1a; 1.关键词优化 调研目标市场的用户行为和检索习惯&#xff0c;挖掘与应用…

Gone框架介绍32 - 函数参数的依赖注入

gone是可以高效开发Web服务的Golang依赖注入框架 github地址&#xff1a;https://github.com/gone-io/gone 文档地址&#xff1a;https://goner.fun/zh/ 函数参数的依赖注入 函数参数的依赖注入&#xff0c;是v1.x版本正式发布的新功能&#xff0c;允许使用Goners仓库中的Gone…

锂磷硫(LPS)属于硫化物固态电解质 Li7P3S11是代表性产品

锂磷硫&#xff08;LPS&#xff09;属于硫化物固态电解质 Li7P3S11是代表性产品 锂磷硫&#xff08;LPS&#xff09;&#xff0c;为非晶态材料&#xff0c;是硫化物固态电解质代表性产品之一&#xff0c;具有热稳定性好、成本较低等优点&#xff0c;在固态电解质中离子电导率较…

【Deep Learning】Meta-Learning:训练训练神经网络的神经网络

元学习&#xff1a;训练训练神经网络的神经网络 本文基于清华大学《深度学习》第12节《Beyond Supervised Learning》的内容撰写&#xff0c;既是课堂笔记&#xff0c;亦是作者的一些理解。 1 Meta-Learning 在经典监督学习中&#xff0c;给定训练数据 { ( x i , y i ) } i \{…

使用Spring Boot实现用户认证和授权

文章目录 引言第一章 Spring Boot概述1.1 什么是Spring Boot1.2 Spring Boot的主要特性 第二章 用户认证和授权基础知识2.1 用户认证2.2 用户授权2.3 Spring Security概述 第三章 项目初始化第四章 实现用户认证和授权4.1 定义用户实体类和角色实体类4.2 创建Repository接口4.3…

IntelliJ IDE 插件开发 | (十)主题插件开发入门

系列文章 本系列文章已收录到专栏&#xff0c;交流群号&#xff1a;689220994&#xff0c;也可点击链接加入。 前言 在前面的章节中&#xff0c;我们介绍的都是功能性插件的开发内容&#xff0c;本文则会介绍一下主题类插件的开发方式。不过本文也只是带大家入个门&#xff…

linux下chromium/chrome中文字体粗体渲染问题

估计不少人更新后都遇到这个情况了吧&#xff0c;粗体渲染如然变得很模糊&#xff0c;很奇怪&#xff0c;Google下说是字体实现方式变了&#xff0c;国内一些网站用的中文字体都是宋体&#xff0c;但是宋体本身没有粗体&#xff0c;Win下的粗体是微软自己通过某种方式实现的&am…

靠3个字寻求机会,情商不够,别勉强自己

之前我分享了一篇文章寻求一个自由职业的前端伙伴&#xff0c;吸引了好几位朋友来咨询合作&#xff0c;中间出现了不少插曲&#xff0c;好在结果是令人满意的。 作为一名初次创业者&#xff0c;我承认很多地方做的不是那么到位&#xff0c;比如招聘合作伙伴&#xff0c;理想的状…

LLM2Vec论文阅读笔记

这是篇LLM论文&#xff0c;用decoder-like的LLM去提取embedding文章认为&#xff0c;decoder-like的LLM在text embedding task表现不优的一大原因就是其casual attention mechanism&#xff0c;其实就是mask的问题。所以只要对现有的decoder-only LLM进行如下三步改进&#xff…

从零到一学FFmpeg:av_compare_ts函数详析与实战

文章目录 前言一、函数原型二、功能描述三、使用场景四、使用实例 前言 av_compare_ts是FFmpeg库中的一个函数&#xff0c;用于比较两个时间戳&#xff08;Timestamps&#xff09;。这个函数广泛应用于视频处理、流媒体播放和多媒体同步等场景&#xff0c;特别是在需要精确控制…

2024 Jiangsu Collegiate Programming Contest C. Radio Direction Finding 题解 交互 二分

Radio Direction Finding 题目描述 This is an interactive problem. Radio direction finding, also known as radio orienteering or radio fox hunting, is a sport that combines radio technology with outdoor navigation. Participants use specialized receivers to…

Java面试题:对比不同的垃圾收集器(如Serial、Parallel、CMS、G1)及其适用场景

Java虚拟机&#xff08;JVM&#xff09;提供了多种垃圾收集器&#xff0c;每种垃圾收集器在性能和适用场景上各有不同。以下是对几种常见垃圾收集器&#xff08;Serial、Parallel、CMS、G1&#xff09;的对比及其适用场景的详细介绍&#xff1a; 1. Serial 垃圾收集器 Serial…

品牌价值超1592亿,九牧是如何炼成“六边形战士”?

作者 | 吉羽 来源 | 洞见新研社 经历了多年高速发展的中国市场开始慢慢减速&#xff0c;消费者正变得越来越“挑剔”&#xff0c;在信息爆炸的今天&#xff0c;企业面临“需求”与“流量”的双重考验。 市场凭什么记住你&#xff1f;选择你&#xff1f; 答案只有一个&#x…

关于飞浆文字识别技术的运用

飞桨PaddlePaddle-源于产业实践的开源深度学习平台&#xff0c;有关文章可以在此进行查询 飞桨&#xff08;PaddlePaddle&#xff09;是一个由百度开源的深度学习平台&#xff0c;它提供了丰富的机器学习算法库&#xff0c;支持多种深度学习模型的构建、训练和部署。飞桨平台具…

【漏洞复现】万户-ezOFFICE download_ftp.jsp 任意文件下载漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

[项目名称]项目介绍、代码解释及推荐理由

项目介绍 ----  [项目介绍文字描述&#xff0c;如果需要&#xff0c;可引入代码进行说明]  代码解释 ----  [详细解释代码&#xff0c;针对关键部分进行分析]  项目地址 ----  请查看[gitcode链接]中的项目&#xff1a;https://gitcode.com/[你的项目地址]  推荐理…