Я пытаюсь оптимизировать код 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"
);
}
Самое смешное, когда я называю этот код в отдельную программу, чтобы проверить, работает ли он, результаты являются совершенными. Однако, когда он вызван в моей основной программе несколько раз, результаты неверны. Любая помощь будет оценена по мере того, как я в настоящий момент не совсем понятна.
У вас, вероятно, есть проблемы с домохозяйством - я предлагаю перекодировать это, по крайней мере, временно, используя встроенные функции, и пусть компилятор позаботится о домашнем хозяйстве. –
Вы должны сравнить сгенерированный код между двумя версиями. Но, скорее всего, это происходит потому, что вы не перечисляете «память» в своем списке clobber. Поэтому компилятору разрешено не загружать вычисленное значение из памяти. –
Я попытался вставить «память» в список сплетен. Это не сработало – fussy