Арифметические операции над 64-битными двойными значениями с использованием ARM Neon Intrinsic's в ARM64 - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь реализовать простую 64-битную операцию двойного сложения, используя ARM Neon.Я сталкивался с этим Вопросом , но в ответе не было примера реализации с использованием встроенной функции ARM.Поэтому любая помощь в предоставлении полного примера очень ценится.Вот что я пробовал до сих пор, используя регистры целочисленных типов.

Примечание:

Обратите внимание, что я использую библиотеку intel / ARM_NEON_2_x86_SSE для моделирования этого ARMНеоновый код с использованием инструкций SSE.Должен ли я перейти на родной ARM неон, чтобы проверить этот код?

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 голосов
/ 14 февраля 2019

Двойная точность не поддерживается на aarch32 NEON.

Поэтому, если вы нацелились на armv7-a при использовании типа данных float64x2_t, он не будет построен.

Если ваша тестовая платформа - aarch64 с установленной 64-битной ОС, просто исключите цель aarch32 из вашего make-файла.

...