neon:multiply 并累加为 64 位作为 IP & OP
neon:multiply and accumulate for 64 bit as IP & OP
有没有办法在 neon 中实现以下逻辑。
因为我没有找到任何 64 位输入和输出值的乘法和累加指令。
int64x2_t result;
int64x2_t num1;
int64x2_t num2;
>> result + = num1*num2 <<
从技术上讲,两个 64 位值可能会产生一个 128 位结果。这就是为什么有以下 int64*int32+int32
函数,但没有采用两个 64 位输入值的函数。
int64x2_t vmlal_s32 (int64x2_t, int32x2_t, int32x2_t);
int64x2_t vqdmlal_s32 (int64x2_t, int32x2_t, int32x2_t);
如果这些对您不起作用,那么您需要使用标量 64*64 运算,然后使用 vaddq_s64
。
注意:Visual Studio 为包括 ARM 在内的所有架构实现 _mul128
、__umul128
、_mulh
和 __umulh
,以处理完整的 64*64 = 128 位场景。
有没有办法在 neon 中实现以下逻辑。 因为我没有找到任何 64 位输入和输出值的乘法和累加指令。
int64x2_t result;
int64x2_t num1;
int64x2_t num2;
>> result + = num1*num2 <<
从技术上讲,两个 64 位值可能会产生一个 128 位结果。这就是为什么有以下 int64*int32+int32
函数,但没有采用两个 64 位输入值的函数。
int64x2_t vmlal_s32 (int64x2_t, int32x2_t, int32x2_t);
int64x2_t vqdmlal_s32 (int64x2_t, int32x2_t, int32x2_t);
如果这些对您不起作用,那么您需要使用标量 64*64 运算,然后使用 vaddq_s64
。
注意:Visual Studio 为包括 ARM 在内的所有架构实现 _mul128
、__umul128
、_mulh
和 __umulh
,以处理完整的 64*64 = 128 位场景。