Смешивание сборки NEON с не векторными функциями - PullRequest
6 голосов
/ 16 мая 2011

Я думаю, что нашел ответ на свой вопрос. Для VFP есть инструкция "fmacs", которая может выполнить ту же задачу, что и скалярные вычисления для регистров NEON / VFP.


Я очень новичок в программировании NEON или ARM ...

Я хочу загрузить верхнюю треугольную матрицу в регистры NEON и интегрировать (накапливать) внешнее произведение вектора, используя одинарную точность. Основные идеи: A + = x '* x, где A - верхняя треугольная матрица. Некоторые из этих операций могут быть выполнены путем векторизации операций с использованием инструкции NEON «vmla.f32» для четырех или двух регистров. Однако иногда мне нужно работать только с одним регистром с одной точностью за раз, то есть не с 2 или 4 регистрами с одинарной точностью. В приведенном ниже примере (не работает) меня интересует строка

// A[8-14] += A[1]*x[1-7] 
"mla  s16, s16, d0[1]\n\t"

Я хочу использовать регистры NEON для выполнения одной операции с одной точностью.

Фрагмент кода:

    __asm__ volatile (
    //load x into registers
    "vldmia    %0, {d0-d3}\n\t"
    // load A into registers
    "vldmia    %1, {d4-d12}\n\t"
    "vldmia    %1, {d13-d21}\n\t"
    // A[0-7] += x[0]*x[0-7]
    "vmla.f32  q2, q2, d0[0]\n\t"
    "vmla.f32  q3, q3, d0[0]\n\t"
    // A[8-14] += A[1]*x[1-7]
    "mla  s16, s16, d0[1]\n\t"
    // output
    :
    // input
    : "r"(A), "r"(x)
    // registers
    : "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10"
    );

1 Ответ

1 голос
/ 13 июня 2011

Так что я думаю, что вы спрашиваете о умножении вектора на скаляр ?

Я бы использовал vdup, чтобы загрузить скаляр во все полосы регистра NEON, а затем умножить.

Если вы можете опубликовать простую версию C, что вы пытаетесь сделать, я мог бы попытаться помочь больше ...

...