DPDK(10):报文处理中的指令预取(prefetcht0)
来源:互联网 发布:linux中如何删除用户 编辑:程序博客网 时间:2024/06/05 22:51
在DPDK的例子中报文处理时读取报文内容时添加了指令预取命令(prefetcht0):
/* * Read packet from RX queues */for (i = 0; i < qconf->n_rx_port; i++) {portid = qconf->rx_port_list[i];nb_rx = rte_eth_rx_burst((uint8_t) portid, 0, pkts_burst, MAX_PKT_BURST);port_statistics[portid].rx += nb_rx;for (j = 0; j < nb_rx; j++) {m = pkts_burst[j];rte_prefetch0(rte_pktmbuf_mtod(m, void *));l2fwd_simple_forward(m, portid);}}
static inline void rte_prefetch0(volatile void *p){asm volatile ("prefetcht0 %[p]" : [p] "+m" (*(volatile char *)p));}
这条指令主要的作用是人为判断下面将要处理的内存,指示CPU加载到缓存中,不过一般需要我们进行实测,向上面这种情况,性能肯定会有提升,一般可以提升10%。
下面是这一系列指令的介绍:转自http://blog.csdn.net/igame/article/details/1752430
和缓存预取有关的指令:
操作码 指令 Description
0F 18 /1 PREFETCHT0 m8 预取数据到所有级别的缓存,包括L0。
0F 18 /2 PREFETCHT1 m8 预取数据到除L0外所有级别的缓存。
0F 18 /3 PREFETCHT2 m8 预取数据到除L0和L1外所有级别的缓存。
0F 18 /0 PREFETCHNTA m8 预取数据到非临时缓冲结构中,可以最小化对缓存的污染。
Intel® C++ Compiler的Intrinsic等效方法:
void _mm_prefetch(char *p, int i)
从地址P处预取尺寸为cache line大小的数据缓存,参数i指示预取方式(_MM_HINT_T0, _MM_HINT_T1, _MM_HINT_T2, _MM_HINT_NTA,分别表示不同的预取方式)
如果在CPU操作数据之前,我们就已经将数据主动加载到缓存中,那么就减少了由于缓存不命中,需要从内存取数的情况,这样就可以加速操作,获得性能上提升。使用主动缓存技术来优化内存拷贝,理论上应该能够提高性能,看来值得一试。
阅读全文
0 0
- DPDK(10):报文处理中的指令预取(prefetcht0)
- DPDK(一):DPDK安装
- DPDK(六):DPDK整体介绍
- DPDK 收发包处理流程(二)(网卡初始化)
- DPDK 收发包处理流程(二)(网卡初始化)
- DPDK收发包处理流程-----(一)网卡初始化
- DPDK收发包处理流程-----(一)网卡初始化
- DPDK收发包处理流程-----(一)网卡初始化【1】
- DPDK收发包处理流程-----(一)网卡初始化【2】
- DPDK收发包处理流程-----(一)网卡初始化【3】
- DPDK(14):rte_mbuf
- DPDK学习(rte_eal_init)
- DPDK学习(eal_thread_loop)
- DPDK学习(基础知识)
- 使用c#来操作XML中的处理指令(PI)
- 浮点数据在通讯报文中的处理
- DPDK(15):DPDK中断机制简析
- DPDK(16):DPDK多核多线程机制简析
- HDU
- [51nod1323]完美平方
- 程序员怎么获取股票实时数据,并进行技术指标分析呢?
- Java基础:深入理解Java的接口和抽象类
- 前端模块化,AMD与CMD的区别
- DPDK(10):报文处理中的指令预取(prefetcht0)
- 抓包工具tcpdump
- window单机开发环境搭建
- python打乱列表等数据结构
- jquery.cookie.js 使用方法
- 插入排序
- spring中@param和mybatis中@param使用区别
- [HAOI2006]受欢迎的牛 scc分解(下标从1)
- java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()L