Optymalizacja kopiowania

Zadanie polega na skopiowaniu tablicy o danym rozmiarze (operację powtarzamy N razy)

Program główny copy.c wywołuje funkcję zdefiniowaną w pliku copy.asm makrodefinicją COPY.

Różne wersje kopiowania

; RDI - dest
; RSI - src
; RDX - n

section .text

global copy_rep
copy_rep:
    cld
    mov rcx, rdx

    rep movsd
    ret


global copy_movsq
copy_movsq:
    cld
    mov rcx, rdx
    shr rcx, 1

    rep movsq
    ret


global copy_loop
copy_loop:
    cld
    mov rcx, rdx
.loop:
    movsd
    loop .loop
    ret


global copy_backward
copy_backward:
    mov rcx, rdx
.loop:
    mov eax, [rsi+4*rcx-4]
    mov [rdi+4*rcx-4], eax
    sub rcx, 1
    ; cmp rcx, 0
    jnz .loop
    ret

global copy_forward
copy_forward:
    mov rcx, 0
.loop:
    mov eax, [rsi+4*rcx-4]
    mov [rdi+4*rcx-4], eax
    add rcx, 1
    cmp rcx, rdx
    jnz .loop
    ret

Uzyskane czasy

Wersja Czasy
rozmiar 10000
N 1000000
copy_rep 0.698529
copy_loop 18.695135
copy_movsq 0.706954
copy_forward 2.711850
copy_backward 2.689194

Uruchomienie

make run_copy