DPDK20.05 – rte_memcpy函数

DPDK中,rte_memcpy 函数是一个非常典型的 DPDK 利用其SIMD指令,对常规函数进行优化的一个示例。

x86版本的实现在 dpdk-20.05/lib/librte_eal/x86/include/rte_memcpy.h 文件中实现。

1、rte_memcpy()

ALIGNMENT_MASK 宏定义的值,根据CPU的不同而不同。
对于支持到 AVX512 指令的CPU,ALIGNMENT_MASK 的值定义为 0x3F,即64字节对齐。
对于支持到 AVX2 指令的CPU,ALIGNMENT_MASK 的值定义为 0x1F,即32字节对齐。
其余的所有CPU,ALIGNMENT_MASK 的值定义为 0x0F,即16字节对齐。

2、rte_mov16()、rte_mov32、rte_mov64、rte_mov128与rte_mov128blocks

由于 Intel CPU 对 SSE、AVX等 SIMD指令的支持,使每次最多处理的数据超过64字节成为可能。
以目前最常见的支持 AVX2 指令较多的CPU为例,该指令集最高支持256位的宽指令。

2.1 rte_mov16()

该函数用来拷贝16字节(128位)数据,且数据的源空间与目的空间不能有重叠。

2.2 rte_mov32()

该函数用来拷贝32字节(256位)数据,且数据的源空间与目的空间不能有重叠。

2.3 rte_mov64()

该函数用来拷贝64字节(512位)数据,且数据的源空间与目的空间不能有重叠。
由于支持到 avx2 指令集的CPU 不支持 512 位宽的指令,因此该函数是将被拷贝数据拆分成两个256位的数据进行拷贝。

2.4 rte_mov128()

该函数的实现与 rte_mov64() 类似,只是将数据分成4部分 256位的数据进行拷贝。
数据的源空间与目的空间不能有重叠。

2.5 rte_mov128blocks()

该函数用来拷贝128字节块(1024位)数据,且数据的源空间与目的空间不能有重叠。
不管数据有多少个128字节块,都将数据以 128 字节为一部分进行划分进行数据拷贝。
这128字节中又会被分成4部分,每部分32字节(256位)进行数据拷贝。

3、rte_memcpy_aligned()

如果要拷贝的源地址和目的地址都是对 ALIGNMENT_MASK 对齐的,则会调用该函数。

4、rte_memcpy_generic()

如果要拷贝的源地址或目的地址没有对 ALIGNMENT_MASK 对齐,则会调用该函数进行数据拷贝。

————————————————————

原创文章,转载请注明: 转载自孙希栋的博客

本文链接地址: 《DPDK20.05 – rte_memcpy函数》

One comment on “DPDK20.05 – rte_memcpy函数”

  1. alex说道:

    /* 最后不管剩余多少(少于64字节),都用256位宽的 SIMD 指令完成 */
    rte_mov64((uint8_t *)dst – 64 + n, (const uint8_t *)src – 64 + n);
    请教一下,关于这部分,为什么不会导致内存被踩踏,在这种情况下mov62,一定会出现读取超过src有效地址的部分数据,覆写到dst尾部 没有找到相关的资料说明

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注