Генерация фракталов с помощью 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.