CSAPP arch lab


arch lab

Download archlab-handout

安裝模擬器

解決undefined reference to ’matherr‘

參考 Y86-64模擬器的安裝與出現對'matherr'未定義引用問題的解決

Part A

在這部分要在sim/misc中完成,我們要編寫和模擬三個Y86-64程序

sum.ys: 遍歷鏈表求和

# begin at 0

    .pos 0
    irmovq stack,%rsp
    call main
    halt

    .align 8
    ele1:
        .quad  0x00a
        .quad ele2
    ele2:
        .quad 0x0b0
        .quad ele3
    ele3:
        .quad 0xc00
        .quad 0

main:
    irmovq ele1,%rdi
    call rsum
    ret

rsum:
    xorq %rax,%rax
    andq %rdi,%rdi 
    je L1
    pushq %rbx
    mrmovq (%rdi),%rbx
    mrmovq 8(%rdi),%rdi
    call rsum
    addq %rbx,%rax
    popq %rbx
L1:
    ret

    .pos 0x200
stack:

YAS編譯后,再用YIS運行

linux> make *.yo
inux> ../misc/yis *.yo

rsum.ys: 用遞歸的方式求和

# begin at 0

    .pos 0
    irmovq stack,%rsp
    call main
    halt

    .align 8
    ele1:
        .quad  0x00a
        .quad ele2
    ele2:
        .quad 0x0b0
        .quad ele3
    ele3:
        .quad 0xc00
        .quad 0

main:
    irmovq ele1,%rdi
    call rsum
    ret

rsum:
    xorq %rax,%rax
    andq %rdi,%rdi 
    je L1
    pushq %rbx
    mrmovq (%rdi),%rbx
    mrmovq 8(%rdi),%rdi
    call rsum
    addq %rbx,%rax
    popq %rbx
L1:
    ret

    .pos 0x200
stack:

copy.ys: 將src復制到dst

# begin at 0

    .pos 0
    irmovq stack,%rsp
    call main
    halt

    .align 8
    src:
        .quad 0x00a
        .quad 0x0b0
        .quad 0xc00
# Destination block
    dest:
        .quad 0x111
        .quad 0x222
        .quad 0x333

main:
    irmovq src,%rdi
    irmovq dest,%rsi
    irmovq $3,%rdx
    call copy_block
    ret

copy_block:
    xorq %rax, %rax
    irmovq $1,%r14
    irmovq $8,%r13
    pushq %rbx
    andq %rdx,%rdx
    jmp test
loop:
    mrmovq (%rdi),%rbx
    addq %r13,%rdi
    rmmovq %rbx,(%rsi)
    addq %r13,%rsi
    xorq %rbx,%rax
    subq %r14,%rdx
test:
    jne loop
    popq %rbx
    ret

    .pos 0x200
stack:

Part B

這部分在sim/seq完成,我們需要修改seq-full.hcl, 給SEQ添加iaddq指令

seq-full.hcl

然后根據文檔測試

./ssim -t ../y86-code/asumi.yo
(cd ../y86-code; make testssim)
(cd ../ptest; make SIM=../seq/ssim)
(cd ../ptest; make SIM=../seq/ssim TFLAGS=-i)

測試均成功

Part C

這部分要在sim/pipe中完成

我們的目的是優化ncopy,然他更快完成,會根據CPE給出一個分數

Step1

添加iaddq(類似於PartB),然后測試

unix> make psim VERSION=full
unix> ./psim -t sdriver.yo
unix> ./psim -t ldriver.yo
unix> ./correctness.pl
unix> ./benchmark.pl

然而竟然還是0.0/60.0,此時CPE大概可以達到11左右,可是從10.5才開始記分

Step2

考慮循環展開,將循環展開8次,分數大概可以提高到40

循環展開后,就可以改變指令執行的順序,避免數據冒險

mrmovq (%rdi),%r8
rmmovq %r8,(%rsi)

這樣會有一個氣泡,如果先把8個數據都放到寄存器,在放到目標地址就可以消除氣泡,降低執行的周期數

Step3

然而還有剩下的余數沒有處理,可以考慮將剩下的余數再循環展開一次,此時已經有50多分了

Step4

將循環展開的次數提高到10次,那么性能會提高一點,但不是很明顯

優化余數的處理方法,最終可以將分數提高到56.1,平均CPE=7.69, ncopy length= 847 bytes

應該還可以優化pipe-full.hclncopy.ys因該也還有提高的空間,以后在補上。。。

ncopy.ys

ncopy:
	xorq %rax,%rax		# count = 0
	iaddq $-10,%rdx      # 
	jl L2		# if so, goto Done: ## if so, goto Loop
Loop:	
	mrmovq (%rdi), %r8
	mrmovq 0x8(%rdi), %r9
	mrmovq 0x10(%rdi), %r10
	mrmovq 0x18(%rdi), %r11
	mrmovq 0x20(%rdi), %r12
	mrmovq 0x28(%rdi), %r13
	mrmovq 0x30(%rdi), %r14
	mrmovq 0x38(%rdi), %rcx
	mrmovq 0x40(%rdi), %rbx
	mrmovq 0x48(%rdi), %rbp
	andq %r8,%r8
	rmmovq %r8, (%rsi)
	rmmovq %r9, 8(%rsi)
	rmmovq %rbx, 0x40(%rsi)
	rmmovq %rbp, 0x48(%rsi)
	jle L1_2
	iaddq $1, %rax
L1_2:
	andq %r9,%r9
	jle L1_3
	iaddq $1, %rax
L1_3:
	andq %r10,%r10
	rmmovq %r10, 0x10(%rsi)
	rmmovq %r11, 0x18(%rsi)
	jle L1_4
	iaddq $1, %rax
L1_4:
	andq %r11,%r11
	jle L1_5
	iaddq $1, %rax
L1_5:
	andq %r12,%r12
	rmmovq %r12, 0x20(%rsi)
	rmmovq %r13, 0x28(%rsi)
	jle L1_6
	iaddq $1, %rax
L1_6:
	andq %r13,%r13
	jle L1_7
	iaddq $1, %rax
L1_7:
	andq %r14,%r14
	rmmovq %r14, 0x30(%rsi)
	rmmovq %rcx, 0x38(%rsi)
	jle L1_8
	iaddq $1, %rax
L1_8:
	andq %rcx,%rcx
	jle L1_9
	iaddq $1, %rax
L1_9:
	andq %rbx, %rbx
	jle L1_10
	iaddq $1, %rax
L1_10:
	andq %rbp,  %rbp
	jle L1_11
	iaddq $1, %rax
L1_11:
	iaddq $0x50, %rdi
	iaddq $0x50, %rsi
	iaddq $-10, %rdx
	jge Loop
L2:
	iaddq $9, %rdx
	jg Loop2
	jl L2_Done
	mrmovq (%rdi),%r8
	rmmovq %r8, (%rsi)
	andq %r8, %r8
	jle Done
	iaddq $1, %rax
L2_Done:
	ret
	
Loop2:
	mrmovq (%rdi), %r8
	mrmovq 8(%rdi), %r9
	iaddq $-2, %rdx
	jg L2_0
	je D3 # last 3
	rmmovq %r8, (%rsi)
	rmmovq %r9, 8(%rsi)
	andq %r8,%r8
	jle D2_1
	iaddq $1, %rax
D2_1:
	andq %r9, %r9
	jle Done
	iaddq $1, %rax
	ret
D3:
	mrmovq 0x10(%rdi), %r10
	rmmovq %r8, (%rsi)
	rmmovq %r9, 8(%rsi)
	rmmovq %r10, 0x10(%rsi)
	andq %r8, %r8
	jle D3_1
	iaddq $1, %rax
D3_1:
	andq %r9, %r9
	jle D3_2
	iaddq $1, %rax
D3_2:
	andq %r10, %r10
	jle Done
	iaddq $1, %rax
	ret

L2_0:
	rmmovq %r8, (%rsi)
	rmmovq %r9, 8(%rsi)
	andq %r8,%r8
	jle L2_1
	iaddq $1, %rax
L2_1:
	andq %r9, %r9
	jle L2_2
	iaddq $1, %rax
L2_2:
	iaddq $0x10, %rdi
	iaddq $0x10, %rsi
	jmp Loop2
Done:
	ret
End:

Step5 待更

。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM