贴出 wiki 中的表格
arm neon | elemsize | elempack |
---|---|---|
float64x2_t | 16 | 2 |
float32x4_t | 16 | 4 |
int32x4_t | 16 | 4 |
float16x4_t | 8 | 4 |
int8x8_t | 8 | 8 |
- 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.