Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #71, ОКТЯБРЬ 2006 г.

война миров

КРИС КАСПЕРСКИ АКА МЫЩЪХ

Спецвыпуск: Хакер, номер #071, стр. 071-024-6


Кстати, обрати внимание, что в развернутом цикле ячейки памяти складываются в различные переменные, а не суммируются в одну! Если же неправильно развернуть цикл, выигрыш в производительности окажется намного меньшим:

// выполняем первые n – (n %4) итераций

for(a = 0; a < n — 3; a += 4)

{

crc += p[a+0] + p[a+1] + p[a+2] + p[a+3];

}

Почему?! Да потому что образуется паразитная зависимость по данным. Процессор не может выполнять «+ p[a+1]», пока не завершится сложение crc с p[a+0], и вычислительный конвейер вынужден простаивать в ожидании!

[напоследок.]

И все же есть области, в которых ассемблер необходим, можно даже сказать, неизбежен. Это, в первую очередь, высокопроизводительные математические и графические библиотеки, использующие векторные инструкции типа MMX или SSE. На эффективную векторизацию данных компиляторы, увы, не способны.

.text:00000000 _CRC proc near

.text:00000000

.text:00000000 var_1 = dword ptr -1

.text:00000000 arg_0 = dword ptr 7

.text:00000000 arg_4 = dword ptr 0Bh

.text:00000000

.text:00000000 51 push ecx

.text:00000001 8B 54 24 0C mov edx, [esp+1+arg_4]

.text:00000005 32 C9 xor cl, cl

.text:00000007 33 C0 xor eax, eax

.text:00000009 88 4C 24 00 mov byte ptr [esp+1+var_1], cl

.text:0000000D 85 D2 test edx, edx

.text:0000000F 7E 16 jle short loc_27

.text:00000011 53 push ebx

.text:00000012 56 push esi

.text:00000013 8B 74 24 10 mov esi, [esp+9+arg_0]

.text:00000017

.text:00000017 loc_17:

.text:00000017 8A 1C 30 mov bl, [eax+esi]

.text:0000001A 02 CB add cl, bl

.text:0000001C 40 inc eax

.text:0000001D 3B C2 cmp eax, edx

.text:0000001F 7C F6 jl short loc_17

.text:00000021 5E pop esi

.text:00000022 88 4C 24 04 mov byte ptr [esp+5+var_1], cl

.text:00000026 5B pop ebx

.text:00000027

.text:00000027 loc_27:

.text:00000027 8B 44 24 00 mov eax, [esp+1+var_1]

.text:0000002B 25 FF 00 00+ and eax, 0FFh

.text:00000030 F7 D8 neg eax

.text:00000032 59 pop ecx

.text:00000033 C3 retn

.text:00000033 _CRC endp

00000000: 51 push ecx

00000001: 8B4C240C mov ecx,[esp+arg_p]

00000005: 8B542408 mov edx,[esp+arg_n]

00000009: 03CA add ecx,edx

0000000B: 33C0 xor eax,eax

0000000D: EB03 jmps 000000012

0000000F: 0201 add al,[ecx]

00000011: 41 inc ecx

00000012: 3BCA cmp ecx,edx

00000014: 72F9 jb 00000000F

00000016: 59 pop ecx

00000017: C3 retn

.text:080483E0 CRC proc near

.text:080483E0

.text:080483E0 arg_0 = dword ptr 8

.text:080483E0 arg_4 = dword ptr 0Ch

.text:080483E0

.text:080483E0 55 push ebp

.text:080483E1 31 D2 xor edx, edx

.text:080483E3 89 E5 mov ebp, esp

.text:080483E5 53 push ebx

.text:080483E6 8B 4D 0C mov ecx, [ebp+arg_4]

.text:080483E9 31 C0 xor eax, eax

.text:080483EB 8B 5D 08 mov ebx, [ebp+arg_0]

.text:080483EE 39 CA cmp edx, ecx

.text:080483F0 7D 16 jge short loc_8048408

.text:080483F2 8D B4 26 00+ lea esi, [esi+0]

.text:080483F9 8D BC 27 00+ lea edi, [edi+0]

.text:08048400

.text:08048400 loc_8048400:

.text:08048400 02 04 1A add al, [edx+ebx]

.text:08048403 42 inc edx

.text:08048404 39 CA cmp edx, ecx

.text:08048406 7C F8 jl short loc_8048400

Назад на стр. 071-024-5  Содержание  Вперед на стр. 071-024-7