Генерация фракталов с помощью SSE/SSE2 - Метод Vodnaya
ОГЛАВЛЕНИЕ
Метод Vodnaya
Также был разработан метод Vodnaya, оптимизированный для Pentium M. Название лишено смысла, поэтому если вам трудно произносить русские слова, можете называть его Vod-метод или V-метод. Он превосходит по производительности методы MOV-ADD и FFFF на Pentium M и Pentium III. О микроархитектуре Pentium M известно мало, поэтому не удалось проанализировать задержки и производительность. После многих проб и ошибок была найдена последовательность команд, казавшаяся самой быстрой на этих процессорах. Метод также является лидером по числу команд: он на одну команду меньше, чем MOV-ADD или FFFF.
MOVAPS xmm0,xmm4
XORPS xmm6,xmm6
MOVAPS xmm1,xmm5
mov ecx, ITER
ILOOP:
; xmm0 = zx xmm1 = zy
MOVAPS xmm2, xmm1
MULPS xmm2, xmm2
MULPS xmm1, xmm0
; xmm0 = zx xmm1 = zy*zx xmm2 = zy^2
MOVAPS xmm3, xmm2 ; save zy^2
MULPS xmm0, xmm0
ADDPS xmm2, xmm0
; xmm0 = zx^2 xmm1 = zy*zx xmm2 = zx^2+zy^2 xmm3 = zy^2
CMPLEPS xmm2, xmm7
ADDPS xmm1, xmm1
SUBPS xmm0, xmm3
; xmm0 = zx^2-zy^2 xmm1 = zy*zx*2 xmm2 = zx^2+zy^2
ADDPS xmm1, xmm5
ADDPS xmm0, xmm4
MOVMSKPS eax, xmm2
test eax, eax
jz EXIT
ANDPS xmm2, xmm7
ADDPS xmm6, xmm2
sub ecx, 1
jnz ILOOP
EXIT:
Сумма zx^2+zy^2 вычисляется в буферном регистре xmm2. zy^2 копируется сюда во избежание его перезаписи, когда программа вычтет zx^2-zy^2. Новые значения для zx и zy вычисляются на месте в регистрах xmm0 и xmm1. Весь метод довольно изящен. Увы, он не самый быстрый для процессоров Pentium-IV и Athlon XP.
Великая битва: MOV-ADD против FFFF против Vodnaya
Сравнение быстродействия трех вышеназванных методов:
В наборе тестов размер изображения был 1024x768 пикселей; время измерялось с помощью команды RDTSC (смотрите исходный код в файле SSEroutines_test.asm). Тесты были повторены 5 раз, и был взят минимальный результат для каждого метода. Времена на диаграмме выражены в миллионах тактовых циклов. Более низкие времена лучше. После названий процессоров показаны их сигнатуры CPUID. Например, Celeron F13 – процессор семейства 15, модели 1, степпинга 3, то есть сокращенный Pentium IV. Его кэши меньше, чем у Pentium IV, но ядро такое же, оттого результаты этого Celeron должны почти равняться результатам Pentium IV (увы, не удалось достать Pentium IV для тестов). "Rabbit(кролик)" означает набор Джулии с C = -0.12+0.74i.
Видимо, MOV-ADD лучший метод для процессоров Pentium IV и Athlon XP. Vodnaya показывает хорошие результаты на процессорах Intel семейства 6 (в частности, Pentium III и Pentium M). FFFF однозначно проигрывает на всех типах процессоров. Повышение быстродействия MOV-ADD по сравнению с FFFF составляет 12% на Pentium IV, и разница между Vodnaya и FFFF составляет 7-11% для Pentium M и Pentium III.
Имеющаяся готовая программа использует Vodnaya на процессорах Intel семейства 6 и метод MOV-ADD на остальных процессорах. Метод выбирается при выполнении с помощью сигнатуры процессора, извлеченной с помощью команды CPUID.