贴出 wiki 中的表格

arm neonelemsizeelempack
float64x2_t162
float32x4_t164
int32x4_t164
float16x4_t84
int8x8_t88
  • float64x2_t 是 arm neon 指令集中的一种数据类型,表示一个由两个浮点数组成的向量。每个浮点数的精度均为 64 位,因此 float64x2_t 类型的向量由两个 64 位浮点数组成,占用 128 位的存储空间。
  • float32x4_t 是 arm neon 指令集中的一种数据类型,表示一个由四个浮点数组成的向量。每个浮点数的精度均为 32 位,因此 float32x4_t 类型的向量由四个 32 位浮点数组成,占用 128 位的存储空间。
  • int32x4_t 是 arm neon 指令集中的一种数据类型,表示一个由四个整数组成的向量。每个整数的精度均为 32 位,因此 int32x4_t 类型的向量由四个 32 位整数组成,占用 128 位的存储空间。
  • float16x4_t 是 arm neon 指令集中的一种数据类型,表示一个由四个浮点数组成的向量。每个浮点数的精度均为 16 位,因此 float16x4_t 类型的向量由四个 16 位浮点数组成,占用 64 位的存储空间。
  • int8x8_t 是 arm neon 指令集中的一种数据类型,表示一个由八个整数组成的向量。每个整数的精度均为 8 位,因此 int8x8_t 类型的向量由八个 8 位整数组成,占用 64 位的存储空间。

这些数据类型的作用

  • 这些数据类型用于在 arm neon 指令集中执行批量的整数运算和浮点数运算,从而加快程序的运行速度。例如,可以使用 arm neon 指令集中的 vaddq_s32 指令来执行两个 int32x4_t 类型的向量的加法运算,或者使用 vmaxq_s32 指令来执行两个 int32x4_t 类型的向量的最大值运算,也可以使用 arm neon 指令集中的 vaddq_f32 指令来执行两个 float32x4_t 类型的向量的加法运算,或者使用 vmaxq_f32 指令来执行两个 float32x4_t 类型的向量的最大值运算。

elempack && elemsize 的理解:

  • elempack 是一个参数,通常用于卷积层或全连接层等神经网络层的定义中。它的作用是控制每个输入数据中的元素在计算时被分成多少个组,以便于加速计算。

    例如,在卷积层中,如果 elempack 取值为 1,则表示每个输入数据中的元素会被分成一个组,即每次计算时处理一个元素。如果 elempack 取值为 4,则表示每个输入数据中的元素会被分成四个组,即每次计算时处理四个元素。

    设置 elempack 参数的值可以在一定程度上加速计算,因为可以通过对多个元素进行批量计算来提高计算效率。但是,如果 elempack 参数的值过大,可能会导致计算效率降低,因此需要根据具体情况调整 elempack 参数的值。

  • elemsize 是一个代表元素大小的数值,通常在描述计算机程序中的数据类型时使用。它表示每个元素所占用的存储空间大小,单位是字节。

    例如,在描述一个整数数组时,可以使用 elemsize 来指定每个整数所占用的存储空间大小。如果 elemsize 设置为 4,则表示每个整数占用 4 个字节的存储空间,即使用 32 位存储每个整数。如果 elemsize 设置为 8,则表示每个整数占用 8 个字节的存储空间,即使用 64 位存储每个整数。

    elemsize 还可以用于描述其他数据类型,例如浮点数、字符串、布尔值等。例如,在描述一个浮点数数组时,可以使用 elemsize 来指定每个浮点数所占用的存储空间大小。如果 elemsize 设置为 4,则表示每个浮点数占用 4 个字节的存储空间,即使用 32 位存储每个浮点数。如果 elemsize 设置为 8,则表示每个浮点数占用 8 个字节的存储空间,即使用 64 位存储每个浮点数。

    注意,elemsize 的值是可以根据具体情况调整的,并且在不同的场景下可能会有所不同。例如,在使用 arm neon 指令集加速卷积层计算时,可以根据卷积核的大小和通道数来调整 elemsize 的值,以优化计算效率。

  • 上边的表格中,我们可知,elempack 是由 neon 指令集的数据类型所包含元素个数决定的。而 elemsize 则是由这个数据类型所占字节数量决定。elemsize = sizeof(neon指令集数据类型) / 8.