DPDK(10):报文处理中的指令预取(prefetcht0)

在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操作数据之前,我们就已经将数据主动加载到缓存中,那么就减少了由于缓存不命中,需要从内存取数的情况,这样就可以加速操作,获得性能上提升。使用主动缓存技术来优化内存拷贝,理论上应该能够提高性能,看来值得一试。
 
注意, CPU 对数据操作拥有绝对自由!使用预取指令只是按我们自己的想法对 CPU 的数据操作进行补充,有可能 CPU 当前并不需要我们加载到缓存的数据,这样,我们的预取指令可能会带来相反的结果,比如对于多任务系统,有可能我们冲掉了有用的缓存。不过,在多任务系统上,由于线程或进程的切换所花费的时间相对于预取操作来说太长了,简直好象一个世纪,所以可以忽略线程或进程切换对缓存预取的影响。  

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值