В программе, которую я написал, 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 и т.д.
* Трудно опубликовать цикл здесь, но я могу сказать вам, что это сильно оптимизированная реализация алгоритма levenshtein.
Это то, что компилятор дает мне для нестрочной версии 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, поэтому я не мог ее удержать.
Обновление: Я тестировал изменения, предложенные Нилсом, эфемерные, однако нет заметного повышения производительности, которое я получаю, используя версии сборки min(). Тем не менее, я получаю повышение на 12,5% путем компиляции программы с помощью -march = i686, что, я думаю, связано с тем, что вся программа получает преимущества от новых быстрых инструкций, которые gcc генерирует с помощью этой опции. Спасибо за помощь ребятам.
P.S. - Я использовал профилировщик ruby для измерения производительности (моя программа C - это общая библиотека, загруженная рубиновой программой), поэтому я мог бы потратить время только на функцию C верхнего уровня, называемую рубиновой программой, которая заканчивается вызовом min ( ) вниз по стеку. См. Этот question.