专业的编程技术博客社区

网站首页 > 博客文章 正文

DPDK深度详解:EAL初始化对CPU的处理

baijin 2024-08-08 23:01:24 博客文章 16 ℃ 0 评论

EAL抽象底层硬件和内存资源,屏蔽底层差异。DPDK应用一开始就需要进行EAL初始化,初始化主要处理CPU、内存、外设(网卡)、线程等资源。

从EAL初始化说起

如图,EAL首先检查当前CPU是否支持运行DPDK。

为什么会需要检查CPU?

EAL为什么检查CPU

这个要从DPDK本身来看,DPDK的最终目的是为了快速转发报文,要做到这个,需要了解CPU的特性。因为,不同的CPU可能会有指令集的差异,只有充分利用它的特有指令集,才能充分利用CPU,最终达到快速转发报文的目的。

所以,DPDK要关注CPU的不同特性,也就是EAL启动时候最先检查CPU。

Dpdk如何处理CPU的异构

为了详细介绍EAL的CPU检测,必须先看一下DPDK是怎么处理不同CPU的。

Dpdk给了一个手段,针对不同的CPU,配置不同的编译选项。

即,在编译的时候,可以通过编译选项,告诉编译器CPU支持哪些特殊(或者专有的)指令集,编译器可以通过配置,针对特定CPU的代码进行代码的编译优化。

然而,一旦编译好,去部署DPDK代码 ,实际的场景中,会有不同的服务器或者CPU芯片,特定的编译配置下所编译出的代码,不同的CPU上可能不能正常运行(因为他们指令集可能不一样),所以DPDK代码会在启动的时候首先调用EAL对CPU做检查。

这就是EAL为什么要调用rte_cpu_is_supported做CPU检测

CPU编译配置

Dpdk编译的可选项可以查看,以dpdk-stable-18.11.2为例,查看如下两个文件

dpdk-stable-18.11.2\mk\ rte.cpuflags.mk

dpdk-stable-18.11.2\mk\toolchain\gcc\ rte.toolchain-compat.mk

芯片支持哪些指令集,可以登陆linux使用下面命令查看

cat /proc/cpuinfo

查看CPU是否支持响应的编译选项

SSE4为例怎么编译

以SSE4(Streaming SIMD Extensions 4)指令集为例,有的cpu是不支持这个指令集的,可以使用

make config T=x86_64-native-linuxapp-gcc

make install T=x86_64-native-linuxapp-gcc

make config T=x86_64-native-linuxapp-gcc EXTRA_CFLAGS="-msse4.2"

make install T=x86_64-native-linuxapp-gcc EXTRA_CFLAGS="-msse4.2"

也可以修改dpdk-stable-18.11.2\mk\ rte.cpuflags.mk,注释掉以下三行。

ifneq ($(filter $(AUTO_CPUFLAGS),__SSE4_2__),)

CPUFLAGS += SSE4_2

endif

EAL执行时候判断

当执行时,dpdk怎么判断

在函数

rte_cpu_is_supported

判断是否支持

rte_cpu_is_supported里首先读取编译配置“RTE_COMPILE_TIME_CPUFLAGS”,这个是在编译配置里面设置这个变量的,可以在dpdk-stable-18.11.2\mk\ rte.cpuflags.mk里面查看。

然后EAL是在rte_cpu_get_flag_enabled里判断CPU是否支持这些FLAG,如果检查到CPU和编译选项不匹配,DPDK的程序就不能正常运行,需要修改编译选项了。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表