Ваш код - Rambo для процессора - его худший кошмар:
- байт доступа.Как и упоминалось выше, ARM ОЧЕНЬ медленно читает байты из памяти
- произвольного доступа.Две абсолютно ненужные операции умножения / сложения в дополнение к и без того крутому снижению производительности по своей природе.
Проще говоря, все неправильно, что может быть неправильно.
Не звоните мнегруб.Позвольте мне вместо этого быть вашим ангелом.
Сначала я предоставлю вам рабочую НЕОН-версию.Затем оптимизированная версия C, показывающая, что именно вы сделали не так.
Просто дайте мне немного времени.Я должен идти спать прямо сейчас, и завтра у меня важная встреча.
Почему бы вам не научиться сборке ARM?Это намного проще и полезнее, чем сборка x86.Это также значительно улучшит ваши возможности программирования на C.Настоятельно рекомендуется
cya
==================================================================================
ОКВот оптимизированная версия, написанная на C с учетом сборки ARM.
Обратите внимание, что оба шага и a_lenx должны быть кратны 4. В противном случае, это не будет работать должным образом.
В этой версии не так много места для оптимизации сборки ARM.(NEON - это другая история, которая скоро появится)
Внимательно рассмотрите, как обрабатывать объявления переменных, цикл, доступ к памяти и операции AND.
И убедитесь, что эта функция выполняется вРежим ARM, а не Thumb для лучших результатов.
unsigned int compare(unsigned int *a, unsigned int a_pitch,
unsigned int *b, unsigned int b_pitch, unsigned int a_lenx, unsigned int a_leny)
{
unsigned int overlap =0;
unsigned int a_gap = (a_pitch - a_lenx)>>2;
unsigned int b_gap = (b_pitch - a_lenx)>>2;
unsigned int aval, bval, xcount;
do
{
xcount = (a_lenx>>2);
do
{
aval = *a++;
// ldr aval, [a], #4
bval = *b++;
// ldr bavl, [b], #4
aval &= bval;
// and aval, aval, bval
if (aval & 0x000000ff) overlap += 1;
// tst aval, #0x000000ff
// addne overlap, overlap, #1
if (aval & 0x0000ff00) overlap += 1;
// tst aval, #0x0000ff00
// addne overlap, overlap, #1
if (aval & 0x00ff0000) overlap += 1;
// tst aval, #0x00ff0000
// addne overlap, overlap, #1
if (aval & 0xff000000) overlap += 1;
// tst aval, #0xff000000
// addne overlap, overlap, #1
} while (--xcount);
a += a_gap;
b += b_gap;
} while (--a_leny);
return overlap;
}