• dpdk-19.11 中 simd 指令使用现状分析


    不同 simd 指令的识别

    __m128i sse

    uint64x2_t neon

    __m256i avx2

    __m512i avx512

    vector altivec

    1. dpdk 向量收发包函数对 simd 指令的使用

    支持 arm neno 向量收发包函数的 pmd 驱动

    • bnxt
    • hns3
    • i40e
    • ixgbe
    • mlx5
    • virtio

    支持 sse 向量收发包函数的 pmd 驱动

    • axgbe
    • hinic
    • fm10k
    • bnxt
    • i40e
    • iavf
    • ice
    • ixgbe
    • mlx5
    • virtio

    支持 avx2 向量收发包函数的 pmd 驱动

    • bnxt
    • enic
    • i40e
    • iavf
    • ice
    • idxd dma 引擎

    支持 avx512 向量收发包函数的 pmd 驱动

    • i40e
    • iavf
    • ice
    • virtio

    支持 ppc 架构 altivec 向量收发包函数的 pmd 驱动

    • i40e
    • virtio
    • mlx5

    其它使用场景

    • drivers/common/sfc_efx
    • drivers/event/dlb2/
    • drivers/raw/ioat/
    • drivers/event/cnxk

    dpdk lib 中对 simd 的使用场景

    distributor 库

    distributor 库提供流量动态负载平衡功能,在这种场景下有一个分发器 lcore,负责负载平衡或分发数据包,以及一组 worker lcore,负责从分发器接收数据包和对它们进行操作。

    此库中使用 sse 向量指令优化了匹配 flow 的过程。

    memcpy 函数优化

    使用 sse、avx512 指令优化 memcpy 函数,封装为 rte_memcpy 函数

    计算 crc 值

    sse、neon、avx512 三种向量指令的不同 crc 计算方式

    LPM

    DPDK LPM 库组件为 32 位密钥实现最长前缀匹配 (LPM) 表搜索方法,该方法通常用于在 IP 转发应用程序中查找最佳路由匹配

    提供使用 sse、neon 指令实现的 rte_lpm_lookupx4 接口实现最长前缀匹配表搜索。

    dpdk ACL 库中 ACL 规则检索优化

    • RTE_ACL_CLASSIFY_SSE

      :向量实现,最多可以并行处理 8 个流。需要 SSE 4.1 支持。要求最大 SIMD 位宽至少为 128。

    • RTE_ACL_CLASSIFY_AVX2

      :向量实现,最多可以并行处理16个流。需要 AVX2 支持。要求最大 SIMD 位宽至少为 256。

    • RTE_ACL_CLASSIFY_NEON

      :向量实现,最多可以并行处理8个流。需要 NEON 支持。要求最大 SIMD 位宽至少为 128。

    • RTE_ACL_CLASSIFY_ALTIVEC

      :向量实现,最多可以并行处理8个流。需要 ALTIVEC 支持。要求最大 SIMD 位宽至少为 128。

    • RTE_ACL_CLASSIFY_AVX512X16

      :向量实现,最多可以并行处理16个流。使用 256 位宽的 SIMD 寄存器。需要 AVX512 支持。要求最大 SIMD 位宽至少为 256。

    • RTE_ACL_CLASSIFY_AVX512X32

      :向量实现,最多可以并行处理32个流。使用 512 位宽的 SIMD 寄存器。需要 AVX512 支持。要求最大 SIMD 位宽至少为 512。

    FIB

    FIB 库为 32 位密钥或 128 位 IPv6 提供了快速的最长前缀匹配 (LPM) 搜索。它可以用于多种应用,其中最典型的是IPv4/IPv6转发。

    FIB 库中使用 avx512 向量指令优化查表过程。

    dpdk node 库中 ip4_lookup_node_process 接口的向量实现

    ip4_lookup_node_process_vec 函数支持 x86 sse 与 arm neon 向量指令优化。

    其它的查表相关使用场景

    lib/efd/rte_efd_x86.h
    lib/hash/rte_cmp_x86.h
    lib/hash/rte_cuckoo_hash.c
    lib/hash/rte_thash.h
    lib/hash/rte_thash_x86_gfni.h
    lib/member/rte_member_x86.h
    lib/sched/rte_sched.c
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    数字孪生可视化在石油生产管理中的具体应用
    48、Nio(Io模型(异步(异步和同步)))
    机器人初识 —— 电机传动系统
    vue3实现塔罗牌翻牌
    C51--PWN-舵机控制
    PixiJs学前篇(三):Canvas基础【下篇】
    德国LFGB检测办理
    jQuery元素的筛选
    什么是内部类?
    【Redis】RedisTemplate序列化传输数据
  • 原文地址:https://blog.csdn.net/Longyu_wlz/article/details/127568408