在 ARM64 中使用 ARM Neon Intrinsic 对 64 位双精度值进行算术运算
Arithmetic operations on 64-Bit double values using ARM Neon Intrinsic's in ARM64
我正在尝试使用 ARM Neon 实现一个简单的 64 位双加运算。我遇到过 this Question 但答案中没有使用 ARM 内在函数的示例实现。因此,非常感谢提供完整示例的任何帮助。到目前为止,这是我使用整数类型寄存器进行的尝试。
旁注:
请注意,我正在使用 intel/ARM_NEON_2_x86_SSE 库来使用 SSE 指令模拟此 ARM Neon 代码。我应该切换到原生 ARM neon 来测试此代码吗?
int main()
{
double Val1[2] = { 2.46574621,0.46546221};
double Val2[2] = { 2.63565654,0.46574621};
double Sum[2] = { 0.0,0.0 };
double Sum_C[2] = { 0.0,0.0};
vst1q_s64(Sum, //Store int64x2_t
vaddq_s64( //Add int64x2_t
vld1q_s64(&(Val1[0])), //Load int64x2_t
vld1q_s64(&(Val2[0])) )); //Load int64x2_t
for (size_t i = 0; i < 2; i++)
{
Sum_C[i] = Val1[i] + Val2[i];
if (Sum_C[i] != Sum[i])
{
cout << "[Error] Sum : " << Sum[i] << " != " << Sum_C[i] << "\n";
}
else
cout << "[Passed] Sum : " << Sum[i] << " == " << Sum_C[i] << "\n";
}
cout << "\n";
}
[Error] Sum : -1.22535e-308 != 5.1014
[Error] Sum : 1.93795e+307 != 0.931208
aarch32
NEON 不支持双精度。
因此,如果您在使用数据类型 float64x2_t
时以 armv7-a
为目标,它将无法构建。
如果您的测试平台是安装了 64 位 OS 的 aarch64
平台,只需从您的 makefile 中排除 aarch32
目标。
我正在尝试使用 ARM Neon 实现一个简单的 64 位双加运算。我遇到过 this Question 但答案中没有使用 ARM 内在函数的示例实现。因此,非常感谢提供完整示例的任何帮助。到目前为止,这是我使用整数类型寄存器进行的尝试。
旁注:
请注意,我正在使用 intel/ARM_NEON_2_x86_SSE 库来使用 SSE 指令模拟此 ARM Neon 代码。我应该切换到原生 ARM neon 来测试此代码吗?
int main()
{
double Val1[2] = { 2.46574621,0.46546221};
double Val2[2] = { 2.63565654,0.46574621};
double Sum[2] = { 0.0,0.0 };
double Sum_C[2] = { 0.0,0.0};
vst1q_s64(Sum, //Store int64x2_t
vaddq_s64( //Add int64x2_t
vld1q_s64(&(Val1[0])), //Load int64x2_t
vld1q_s64(&(Val2[0])) )); //Load int64x2_t
for (size_t i = 0; i < 2; i++)
{
Sum_C[i] = Val1[i] + Val2[i];
if (Sum_C[i] != Sum[i])
{
cout << "[Error] Sum : " << Sum[i] << " != " << Sum_C[i] << "\n";
}
else
cout << "[Passed] Sum : " << Sum[i] << " == " << Sum_C[i] << "\n";
}
cout << "\n";
}
[Error] Sum : -1.22535e-308 != 5.1014
[Error] Sum : 1.93795e+307 != 0.931208
aarch32
NEON 不支持双精度。
因此,如果您在使用数据类型 float64x2_t
时以 armv7-a
为目标,它将无法构建。
如果您的测试平台是安装了 64 位 OS 的 aarch64
平台,只需从您的 makefile 中排除 aarch32
目标。