В написанной мною программе 20% времени тратится на поиск не менее 3 чисел во внутреннем цикле, в этой подпрограмме:
static inline unsigned int
min(unsigned int a, unsigned int b, unsigned int c)
{
unsigned int m = a;
if (m > b) m = b;
if (m > c) m = c;
return m;
}
Есть ли способ ускорить это? Я в порядке с ассемблером код тоже для x86 / x86_64.
Редактировать: В ответ на некоторые комментарии:
* Используется компилятор gcc 4.3.3
* Что касается сборки, я здесь только новичок. Я попросил сборку здесь, чтобы узнать, как это сделать. :)
* У меня работает четырехъядерный процессор Intel 64, поэтому поддерживаются MMX / SSE и т. Д.
* Здесь сложно опубликовать цикл, но я могу сказать, что это сильно оптимизированная реализация алгоритма Левенштейна.
Это то, что дает мне компилятор для не встроенной версии min:
.globl min
.type min, @function
min:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl 12(%ebp), %eax
movl 16(%ebp), %ecx
cmpl %edx, %eax
jbe .L2
movl %edx, %eax
.L2:
cmpl %ecx, %eax
jbe .L3
movl %ecx, %eax
.L3:
popl %ebp
ret
.size min, .-min
.ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
.section .note.GNU-stack,"",@progbits
Встроенная версия находится в оптимизированном для -O2 коде (даже мои маркеры mrk = 0xfefefefe, до и после вызова min ()) оптимизируются gcc, поэтому я не смог его достать.
Обновление: Я протестировал изменения, предложенные Nils, ephemient, однако ощутимого прироста производительности я не получаю, используя версии сборки min (). Тем не менее, я получаю увеличение на 12,5%, компилируя программу с параметром -march = i686, что, как я полагаю, объясняется тем, что вся программа получает преимущества от новых более быстрых инструкций, которые gcc генерирует с этой опцией. Спасибо за вашу помощь, ребята.
P.S. - Я использовал профилировщик ruby для измерения производительности (моя C-программа является общей библиотекой, загружаемой ruby-программой), поэтому я мог получать время, затрачиваемое только на функцию C верхнего уровня, вызываемую ruby-программой, которая в итоге вызывает min ( ) вниз по стеку. Пожалуйста, посмотрите этот вопрос .