使用ARM64中的ARM Neon本征对64位双精度值进行算术运算

时间:2019-02-07 10:40:55

标签: c x86 neon

我正在尝试使用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

1 个答案:

答案 0 :(得分:2)

aarch32 NEON不支持双精度。

因此,如果您在使用数据类型armv7-a时将float64x2_t定位为目标,则它将不会生成。

如果您的测试平台是安装了64位操作系统的aarch64平台,则只需从生成文件中排除aarch32目标即可。