2013-05-28 4 views
0

Я пытаюсь оптимизировать код raytracer на beagleboard, и для этого я использую сопроцессор NEON. Существует функция умножения на матрицу, которая называется несколько раз, которую я написал в встроенной сборке. Однако по некоторым причинам результаты неточны. Вот мой код:ARM NEON не дает точных результатов.

void VecMatMult(float Vt[4], float M[4][4], float V[4]) 
{ 

    __asm__ volatile(

    "vldmia %1, {q1-q4} \n\t" // Load the Matrix in the quad registers 
    "vldmia %2, {q5} \n\t" //Load the Vector 
    "vmul.f32 q0, q1, d10[0] \n\t" //Calculate the matrix product 
    "vmla.f32 q0, q2, d10[1] \n\t" 
    "vmla.f32 q0, q3, d11[0] \n\t" 
    "vmla.f32 q0, q4, d11[1] \n\t" 
    "vstmia %0, {q0} \n\t" //Store the output 
    : 
    :"r" (Vt), "r" (M), "r" (V) 
    :"q0", "q1", "q2", "q3", "q4", "q5" 
    ); 

} 

Самое смешное, когда я называю этот код в отдельную программу, чтобы проверить, работает ли он, результаты являются совершенными. Однако, когда он вызван в моей основной программе несколько раз, результаты неверны. Любая помощь будет оценена по мере того, как я в настоящий момент не совсем понятна.

+0

У вас, вероятно, есть проблемы с домохозяйством - я предлагаю перекодировать это, по крайней мере, временно, используя встроенные функции, и пусть компилятор позаботится о домашнем хозяйстве. –

+2

Вы должны сравнить сгенерированный код между двумя версиями. Но, скорее всего, это происходит потому, что вы не перечисляете «память» в своем списке clobber. Поэтому компилятору разрешено не загружать вычисленное значение из памяти. –

+0

Я попытался вставить «память» в список сплетен. Это не сработало – fussy

ответ

2

Я не знаю точно, как встроенная сборка обрабатывает сохранение регистров, но, согласно ATPCS, d8 ~ d15 необходимо сохранить до использования, поэтому не очень удобно использовать их (если не совсем необходимо) для запуска с.

Это приведет к потере производительности (если встроенный ассемблер делает правильную работу), или он будет делать что-то «необоснованное» (если встроенный ассемблер не удается)

Попробуйте использовать q8 ~ q13 вместо. Это была бы безопасная ставка.

Смежные вопросы