Содержание материала

 

 

Цикл состоит их 4 инструкции. 1 CMP, 1 JA, 1 INC и 1 JMP. Latency и throughput для этих двух инструкции на P4 следующие: CMP 0.5/0.5, JA X/0.5, INC 0.5/1 и JMP X/0.5. X означает, что "latency is not applicable to this instruction" «Латентность не применима к данной инструкции». Дополнительная латентность, которую мы имеет: 0.5 + X + 0.5 + X = ? циклов.

Code:

function ForLoopLoopInverNoNoName(Start, Stop : Integer) : Integer;

asm

mov ecx, eax

//Result := 0;

xor eax,eax

//for I := Start to Stop do

cmp ecx, edx

ja  @LoopEnd

@LoopStart :

inc ecx

cmp ecx, edx

jbe @LoopStart

@LoopEnd :

end;

 

Данный цикл состоит из 3 инструкций, также с неизвестной суммой латентности.

Code:

function ForLoopNoLoopInverNoName(Start, Stop : Integer) : Integer;

asm

//Result := 0;

xor ecx,ecx

//for I := Start to Stop do

sub edx,eax

cmp edx, 0

@LoopStart :

jz  @LoopEnd

inc eax

dec edx

jmp @LoopStart

@LoopEnd :

mov eax,ecx

end;

 

 

Данный цикл состоит из 4 инструкций, также с неизвестной суммой латентности. Заметим, что две инструкции INC/DEC имеют возможность выполняться параллельно. Поскольку за DEC NoName инструкцией не следует условный переход JMP, это выглядит как преимущество, в отсутствии необходимости использования инструкций CMP или TEST для установки флагов, но инструкция JMP не изменяет значения флагов и они доступны, когда мы попадаем на инструкцию JZ в начале цикла. Только в первой итерации инструкция CMP EDX,0 необходима для этого.

Code:

function ForLoopLoopInverNoName(Start, Stop : Integer) : Integer;

asm

//Result := 0;

xor ecx,ecx

//for I := Start to Stop do

sub edx,eax

jl @LoopEnd

inc edx

@LoopStart :

inc eax

dec edx

jnz @LoopStart

@LoopEnd :

mov eax,ecx

end;

 

 

Данный цикл состоит из 3 инструкций, также с неизвестной суммой латентности. Здесь также есть независимая пара INC/DEC.

Это очень простая измерительная программа (benchmark), которую я использую для проверки производительности этих четырех функций.

Code:

var

Starttime, Endtime, Runtime : TDateTime;

I, LoopResult : Integer;

RunTimeSec, NoOfLoopsPerSec, NoOfLoops, ClockCount, LoopEnd2Float,

LoopEndFloat, LoopStartFloat : Double;

 

begin

Starttime := Time;

for I := 1 to LOOPEND2 do

begin

  LoopResult := ForLoopNoLoopInverNoName(LOOPSTART, LOOPEND);

end;

Endtime := Time;

Runtime := Endtime - Starttime;

CEdit.Text := IntToStr(LoopResult);

RuntimeEdit4.Text := TimeToStr(Runtime);

RunTimeSec := RunTime*24*60*60;

LoopEnd2Float := LOOPEND2;

LoopEndFloat := LOOPEND;

LoopStartFloat := LOOPSTART;

NoOfLoops := LoopEnd2Float * (LoopEndFloat - LoopStartFloat);

NoOfLoopsPerSec := NoOfLoops / RunTimeSec;

ClockCount := CLOCK / NoOfLoopsPerSec;

ClockCountEdit4.Text := FloatToStrf(ClockCount, ffFixed, 9, 1);

end;

 

результаты на P4 1920 следующие:

No Loop Inversion and No NoName variable    00:00:55  (2.7 Clock cycles)

Loop Inversion but No NoName variable       00:00:39  (1.9 Clock cycles)

No Loop Inversion but NoName variable       00:01:02  (3.0 Clock cycles)

Loop Inversion + NoName                     00:00:41  (2.0 Clock cycles)

результаты на P3 1400 следующие:

No Loop Inversion and No NoName variable    00:01:26  (3.0 Clock cycles)

Loop Inversion but No NoName variable       00:01:26  (3.0 Clock cycles)

No Loop Inversion but NoName variable       00:01:55  (4.0 Clock cycles)

Loop Inversion + NoName                     00:01:26  (3.0 Clock cycles)

Конечно, clock count числа должны быть целыми. На P4 возможны пол цикла, в связи с double-clocked ALU. Наши измерения не так хороши, как хотелось бы, но для сравнения производительности циклов они достаточны.

Заключение для P4. Используйте только No Loop Inversion или loop inversion with NoName variable оптимизацией.

Заключение для P3. Не используйте No Loop Inversion but NoName variable оптимизацию.

Заключение для обеих платформ. Используйте обе оптимизации как делает Delphi.

Также обратите внимание насколько эффективен P4 на этом коде.

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить