Professional Documents
Culture Documents
Finals
Finals
Finals
Addition-Subtraction
เราอาศัย 2’s complement ในการคิดบวกลบ และเราจะต้ องดูวา่ มัน overflow ได้ หรื อไม่ด้วย
x y Operation Overflow
+ + Addition Possible, roll to negative
+ - Addition Impossible
- - Addition Possible, to positive
+ + Subtraction Impossible
+ - Subtraction Possible, to negative
- - Subtraction Impossible
Multiplication
เราคูณฐานสองแบบเด็กๆ เลย แบบทางขวาเนี่ย พอเข้ าใจง่ายมัย้
Set product = 0
1 0
Product (64) Control Shift Right
Multiplicand (32)
Shift
1 bit
Shift
1 bit ALU (32)
Yes
ตัวอย่างการคูณ แสดงดังตารางนี ้
Signed Multiplication
ทาได้ โดยการ
จา sign ไว้
แปลงลบเป็ นบวกให้ หมดก่อน
คูณปกติ
แล้ วแปลง sign กลับ
Implementation
ใน MIPS ผลการคูณจะถูกเก็บไว้ ใน HI กับ LO การจะเอาค่าออกมาต้ องใช้ คาสัง่ mfhi, mflo เพื่อเอามาไว้ ใน register ของเรา
Division
Start
Divisor (64)
64 Shift Right
64
Remainder (64) Control 0/1 LSB
Divisor (32)
Shift 1
Shift 0 64
ALU (32)
>>1
64
>>
R(32) | Q(32) << Control
write
33 ? +/- test
End
ลองมาทาการหารกันบ้ างดีกว่า
จริ งๆ แล้ วต้ องใช้ R|Q = 2n+1 bits ถ้ าเราต้ องการหารเลข n bits และเราต้ องเก็บผลลัพธ์ ตามที่ขีดเส้ นใต้ ไว้ อีกด้ วย (ถ้ าไม่ทาแบบนี ้คาตอบ
อาจไม่เท่ากัน)
Signed Division
การหารคิดเครื่ องหมาย หลักการคล้ ายการคูณ คือต้ องแปลงเครื่ องหมายก่อน-หลังการดาเนินการ ทัง้ นี ้ ดังที่เห็นในภาพ เราต้ องทาให้
เครื่ องหมายของเศษตรงกับเครื่ องหมายของตัวตังเสมอ
้
Modules
แบ่งโค้ ดของเราเป็ น module ข้ างในก็ทางานไปตามเรื่ องตามราว แต่ modules เหล่านี ้จะทางานตลอดเวลาตามพฤติกรรม ไม่มีการเรี ยก
ฟั งก์ชนั เหมือนภาษาโปรแกรมมิงที่เรารู้จกั ต่อไปนี ้จะเป็ นตัวอย่างการเขียนวงจร NAND และผลลัพธ์ที่ได้
module mynand(in1,in2,out);
input in1,in2;
output out;
assign out = ~(in1&in2)
endmodule
module foo(p,q,p_b,q_b,o)
input p,q,p_b,q_b
output o
wire w, w_b
mynand nand1(.out(w), .in1(p), .in2(q)) ;
mynand nand2(.out(w_b), .in1(p_b), .in2(q_b)) ;
mynand nand3(.out(o), .in1(w), .in2(w_b)) ;
endmodule
Signals in Verilog
สัญญาณมีสรี่ ูปแบบ คือ 0, 1, Z, X ซึง่ สามารถนามา “ผสม” กันได้ โดยจะมีผลดังตารางต่อไปนี ้
0 1 X Z
0 0 X X 0
1 X 1 X 1
X X X X X
Z 0 1 X Z
Bus
บัส คือการรวมสัญญาณย่อยๆ หลายๆ เส้ นเข้ าด้ วยกัน การประกาศและใช้ งานบัสนันคล้
้ ายอาร์ เรย์ แต่มีลกู เล่นแปลกๆ ที่เราสามาถทากับบัส
ได้ ด้วย เช่น การต่อสัญญาณทางขนาน (concatenation)
Concatenation
Concatenate “once”, for example: assign a[63:0] = {b[31:0], c[31:0]};
module what_is_me(a,y);
input [2:0] a;
output [7:0] y;
reg [7:0] y;
always @ (a)
case(a)
3'h0 : y = 8'h01;
3'h1 : y = 8'h02;
3'h2 : y = 8'h04;
3'h3 : y = 8'h08;
3'h4 : y = 8'h10;
3'h5 : y = 8'h20;
3'h6 : y = 8'h40;
3'h7 : y = 8'h80;
endcase
endmodule
Hardware Designs
Single-Cycle Design
เป็ นแบบที่เราเคยเรี ยนมา คือมี latch (memory element) ที่เป็ น sequential ผสมกับ combinational logic circuit โดยการออกแบบเป็ น
worst-case design คืออะไรใช้ เวลามากสุด (delay time มาก) ก็จะเป็ นตัวกาหนด clock interval ที่เล็กที่สดุ เท่าที่ทาได้ เช่น วงจรใช้ เวลาวิ่ง
ผ่านเกตรวม 100ns ก็ห้ามทา clock ที่เร็ วกว่านัน้
Pipeline Design
ไม่ใช่ท่อส่งแก๊ ส! แต่เป็ นการออกแบบโปรเซสเซอร์ ที่สงู ขึ ้นมา ทาให้ ทางานได้ อย่างมีประสิทธิภาพมากขึ ้น โดยโยนงานต่อเป็ นทอดๆ และรับ
งานใหม่เข้ ามาอย่างรวดเร็ ว ทาให้ รับงานใหม่ได้ โดยไม่ต้องรองานเก่าวิ่งจนจบ (แค่วิ่งไปให้ พ้นทางก็พอ)
Understanding MIPS
32 registers
Instruction Format
o R-type
o I-type
o J-type
Instruction Types
o ALU/Logic
o Load/Store
o Branch/Jump
How to Design
มีหลายตัว แต่ละอันก็มีความเหมาะสมต่างกัน เช่น หากเราลองออกแบบด้ วย Finite State Machine (FSM)
อะไรๆ ก็มากไปหมด จึงไม่เหมาะกับการทางานที่ทวั่ ไป (general-purpose) เพราะมันต้ องทาทุกอย่าง บนทุก states นอกจากนี ้ FSM มีระดับ
การประมวลผลที่ต่าเกินกว่าจะมาออกแบบอะไรแบบนี ้ได้ คิดดูว่าเช็ควงเล็ บยังทาไม่ได้ เลย ต้ องไปใช้ พวก push-down automata + ทา
stack (ยังมี Turing Machine ที่มีความสามารถในการคานวณสูงสุดอีก แต่จะเรี ยนใน Theory)
โครงสร้ างที่จะมาจาลอง Turing Machine แบบง่ายๆ เกิดจาก Memory ต่อกับ ALU ที่มี select มาเลือกคาสัง่ อีกที ส่วนตัว memory ก็ตอ่ กับ
memory control ซึง่ ทังหมดก็
้ รับคาสัง่ มาจาก control อีกที
ข้ อจากัดของ Turing Machine ก็มีเหมือนกัน เช่น Halting Problem (ปั ญหาที่ถามว่าโปรแกรมหนึง่ ๆ จะทางานจนจบหรื อไม่)
การทางานของ Single-Cycle CPU จะต้ องไม่ให้ ความเร็ วคล็อกเร็ วไปกว่าความเร็ วที่ช้าที่สดุ ของวงจร (อย่าลืมว่าอุปกรณ์ทกุ ชิ ้นในวงจรมี
propagation delay เสมอ ดังที่ได้ เรี ยนไปแล้ วใน Digital Systems)
Instruction Fetch (IF) มีหน้ าที่ดงึ คาสัง่ ออกมาจาก Instruction Memory (ที่เก็บคาสัง่ ของเรา)
Instruction Decode (ID / REG) มีหน้ าที่แปลงคาสัง่ และดึงค่าจาก Register ที่ต้องใช้
Execution (EXE / ALU) มีหน้ าที่ทาการคานวณล้ วนๆ
Memory (MEM) มีหน้ าที่ store / load ค่าจาก memory
Write-Back (WB) มีหน้ าที่เขียนค่าใหม่ลงใน Registers (เช่น ค่าที่โหลดมา หรื อผลจากการคานวณ)
เราจะเห็นได้ อย่างชัดเจนว่า คาสัง่ บางคาสัง่ ก็จะใช้ CPU ไม่ครบทุกส่วน เช่น add ไม่ใช้ MEM เลย เพราะว่าไม่ได้ เก็บค่าหรื อดึงค่าใดๆ ออก
จากหน่วยความจา หรื อ beq ที่ไม่มีการเขียนค่ากลับหรื อเข้ า memory เลย เพราะเราโยนผลการบวกออกมาเป็ นการแปลง program counter
ทันทีโดยไม่มีการบันทึกค่า เป็ นต้ น
ตัวอย่างหนึง่ ที่นา่ สนใจคือการซักผ้ า สมมติเราอยูห่ อแล้ วรวมผ้ ากันซัก ผ้ าต้ องแยกกลุม่ กัน (จะได้ ไม่ปนกัน) ทาทีละตะกร้ าไป ถ้ ามัวแต่ รอกัน
มันก็จะช้ า ซึง่ ไอ้ การรอกันที่วา่ ก็คือหลักของ Single Cycle ทุกประการ
แบบซ้ ายคือแบบ Single-Cycle เราต้ องรองานจบก่อน กับแบบขวาคือ Pipeline เราโยนผ้ าใส่เครื่ องต่อไปได้ เลย จะเห็นว่าแบบซ้ ายใช้ เวลาต่อ
cycle ทังหมด
้ 30+40+20 = 90 นาที ในขณะที่แบบขวาใช้ เวลาต่อ cycle ทังหมด
้ max(30,40,20) = 40 นาที
Data Hazard
Data Hazard จะเกิดขึ ้นเมื่อเราต้ องการข้ อมูลทันที แต่มนั ยังไม่มีให้ เพราะคาสัง่ ก่อนหน้ ายังทาไม่เสร็ จ เช่น
add $1,$2,$3
ori $8, $1, 0xff
สังเกตว่า $1 สาหรับ ori มันยังไม่มา เพราะเมื่อ ori วิ่งเข้ า EXE นัน้ add ยังอยูใ่ น MEM (ยังไม่ WB ค่าใหม่จะไม่มา!)
Stalling คือเราหยุดการทางานโปรแกรมไว้ ก่อน รอจนค่ามาที่ๆ เราต้ องใช้ แล้ วค่อยลุยต่อ วิธีนี ้เสียเวลาแต่ไม่ต้องแก้ ฮาร์ ดแวร์ เลย
หากเราคิดๆ ดูจะได้ วา่
o ถ้ าคาสัง่ ใช้ คา่ ใน regfile ต่อกันทันที จะเสีย 2 cycles
o ถ้ ามีคาสัง่ อื่นมาคัน ่ กลาง (ที่ไม่ไปทาให้ เกิด stalling เพิ่ม) จะเสีย 1 cycle
Forwarding
o คือการยินยอมให้ สง่ ค่าบางค่าไปยัง pipeline stage ที่ต้องการได้ ทน
ั ทีโดยไม่ต้องรอจบ cycle เราทาโดยการช็อตขาแล้ ว
เอา MUX มาดักไว้ แล้ วใช้ control signal ในการเลือกค่า
o การจะดูวา่ Forwarding ได้ หรื อไม่นนเราควรเขี
ั้ ยนแผนภาพเวลาด้ วย โดยการ forward จะต้ องไม่ให้ มีการวิ่งย้ อนเวลาได้
MUX
ForwardA
ALU
Reg File
MUX
Memory
(data)
MUX
ForwardB
Rt
MUX
Rd EX/MEM.RegisterRd
Rt
Rs
ตัวอย่างของ Forwarding
lw $1, 4($3)
addi $2,$1,10
sub $2,$2,$1
Without Forwarding
o lw ทางาน + 2 bubble เพราะมีคนรอ $1 มาติดๆ
o addi ทางาน + 2 bubble เพราะมีคนรอ $2 มาติดๆ
o sub ทางาน
o รวมเป็ น 7 clocks
With Forwarding
o lw แล้ วยังไงก็ต้อง stall 1 clock เพราะเข้ ากรณี lw-stall
o addi แล้ วใช้ forwarding
o sub รับ forwarding มา
o รวมเป็ น 4 clocks
Control Hazard
เราแก้ ปัญหาเรื่ องข้ อมูลเข้ าช้ าได้ แล้ ว ปั ญหาต่อไปคือถ้ าคาสัง่ ที่ n เป็ น branch (beq) แล้ วต่อมาคาสัง่ ที่ n+1 ต้ องทาอะไรต่อล่ะทีนี ้? ในการ
ทางานของ branch นันมั ้ นมีทางเลือกสองทางคือ จะ fall through (ไปบรรทัดต่อไป) หรื อจะกระโดดไปยังตาแหน่งที่อยูใ่ นคาสัง่ เลยดี
เราสามารถแก้ ปัญหานี ้ได้ โดยใช้ Quick Compare ซึง่ เป็ นการยิงผลลัพธ์จากการเช็คค่าเท่าไม่เท่าในขัน้ EXE กลับมาที่ระบบ update PC เลย
แบบนี ้ก็จะเร็ วขึ ้นไปอีก เพราะคาสัง่ ใหม่จะเข้ ามาในขณะที่ beq อยูใ่ น EXE เท่านัน้ (เสียน้ อยลงเหลือ 1 clock)
อีกวิธีหนึง่ ที่นิยมใช้ กนั คือ Delayed Branching ซึง่ อาจกาจัดการเสีย clock ได้ ทงหมด!!!
ั้ นี่ไม่ใช่วิธีทางฮาร์ ดแวร์ แต่เราอาศัยความสามารถ
ของ MIPS Compiler มาช่วย เช่นเรามีคาสัง่ ภาษาซีวา่ :
z=1;
if (x==a) y=5;
else y=6;
เราแปลงเป็ น Assembly ได้ เป็ น
addi $3, $0, 1
bne $1, $4, L1
addi $2, $0, 5
j L2
L1: addi $2, $0, 6
L2:
แบบนี ้ช้ า เพราะ bne ต้ องเสียเวลา 1 clock ว่างๆ ไป เราจะสลับบรรทัด addi แรกกับ bne
ว่าแต่ที่เรี ยนมานานแล้ วน่ะ แล้ วทาไม jal ถึงเก็บ pc+8? นัน่ ก็เป็ นเพราะใน pc+4 มี delayed slot อยูแ่ ล้ วไง
อีกวิธีที่นา่ สนใจอย่างยิ่งคือ Branch Prediction ซึง่ จะเป็ นการ “จา” ไว้ วา่ ที่ผา่ นมานันเราได้
้ take branch รึ เปล่า เพราะการทางานคาสัง่ บาง
ประเภทเช่น for-loop นันเรามี
้ แนวโน้ มที่จะกลับเข้ าไปบ่อยๆ
ถ้ าเรามีคา่ 1 bit ไว้ เก็บว่าแต่ละบรรทัดจะทางานซ ้าหรื อไม่ เราก็จะเดาได้ ง่ายขึ ้นว่าจะต้ องทางานหรื อไม่ โดยถ้ า branch ก็ใส่ 1 ถ้ าไม่ branch
ก็ใส่ 0 ก่อนจะทาการ branch เราก็โหลดคาสัง่ ที่เหมาะสมมาต่อรอไว้ เลย ถ้ าผิดก็ flush คาสัง่ ทิ ้งไปจากระบบ
Not Taken
T Taken
T
Taken
Taken
NT Not Taken
NT
Not Taken
Chapter 5: Memory
Age of Memory
หน่วยความจามีการพัฒนามาโดยตลอดตังแต่ ้ ยคุ 50’s โดยสมัยนันใช้
้ Core Memory เหนี่ยวนาสนามแม่เหล็กเพื่อเก็บค่า (เกร็ ด: เวลาเครื่ อง
บึ ้มแล้ วมันขึ ้นว่า “Core Dump” ก็หมายถึงกระบวนการโบราณนี ้ คือมัน dump ข้ อมูลมาจาก core memory นัน่ เอง)
ในยุค 70’s ได้ มีการพัฒนาใช้ semiconductor มาทาหน่วยความจา ขนาดของ memory และราคาต่อหน่วยก็ลดลงเรื่ อยๆ
Memory is so expensive!
Memory Type Access Time Cost (Baht per GB) Typical Size in Market
SRAM 1ns 100000 Not for separate sale
DRAM 60ns 2000 4-8GB
Magnetic Disk 10ms 50 Up to 1.5TB-2TB
Solid-State Drive microseconds 500-1000 Up to 512GB (very expensive here!)
แต่ไม่วา่ อย่างไร ของดีมนั ก็ยงั แพงอยูว่ นั ยังค่า แถมเล็กอีกต่างหาก
แล้ วเราจะทาอย่างไรให้ ได้ สงิ่ ที่ทกุ คนต้ องการ?
เร็ ว
ใหญ่
ถูก
Memory Hierarchy
เป็ นผลจากการหลอกผู้ใช้ เราเอาของเร็ ว (SRAM Cache) ไว้ ใกล้ CPU มากที่สดุ เอาของที่ใหญ่แต่ช้าอยู่ห่างออกมาคือ DRAM และเอาของ
ใหญ่มากที่สดุ ไว้ หา่ งๆ คือ Hard Drive
Temporal Locality
o โปรแกรมใช้ ข้อมูลก้ อนนี ้แล้ วมีแนวโน้ มใช้ อีก
Spatial Locality
o โปรแกรมมักใช้ ข้อมูลใกล้ ๆ กัน
Caching
เปรี ยบเสมือนการสร้ างห้ องเก็บของเล็กๆ เก็บเครื่ องมือที่เราใช้ บอ่ ยที่สดุ จะได้ ไม่ต้องไปเบิก -คืนบ่อยๆ (หยิบเอง = 3 นาที, เบิก = 3 วัน?)
Cache
Main Memory
การ map แบบนี ้ก็เป็ นวิธีหนึง่ สมมติวา่ เราอยากได้ “กล่องสีเขียว” เราก็ดใู น cache ก่อนว่าของเขียวๆ ใช่กล่องสีเขียวที่เราต้ องการหรื อไม่ ถ้ า
เจอก็หยิบไปใช้ ไม่เจอก็ไปเบิกมาใส่ รูปแบบนี ้เป็ นการเก็บแบบอ้ างอิง modulo ซึง่ ก็เป็ นที่ใช้ กนั ทัว่ ไปอย่างหนึง่
(2) Equal? Yes: HIT (get data), No: MISS (go to DRAM)
...
ภาพข้ างต้ นเป็ นภาพแสดงโครงสร้ างข้ อมูล บรรทัดบนที่ลอยออกมาคือการประมวลค่าเพื่อเอาไปหาใน Cache ส่วนตารางๆ ข้ างล่างคือตัว
Cache เอง สังเกตการเก็บของมันว่า Index นันมี
้ อยูแ่ ล้ วโดยธรรมชาติ ไม่จาเป็ นต้ องเก็บ และแต่ละบรรทัดก็เก็บค่าไว้ 1 byte
แต่จริ งๆ แล้ วเราไม่นิยมเก็บค่าทีละไบต์ เรานิยมเก็บกันทีละ Word (4 byte) เพราะฉะนัน้ จานวน “บรรทัด” จะลดลงเหลือ ¼ ทาให้ จานวน
address bits ลดลงไป 2 bits… ไม่จริ ง!! เพราะเราก็ต้องเผื่อ address ไว้ เรี ยกตาแหน่งไบต์อยูด่ ี
(2) Equal? Yes: HIT (get data), No: MISS (go to DRAM)
(3) Get by Byte Number
Index-1 V Tag (20) Data (8) Data (8) Data (8) Data (8)
Index V Tag (20) Data (8) Data (8) Data (8) Data (8)
Index+1 V Tag (20) Data (8) Data (8) Data (8) Data (8)
Index+2 V Tag (20) Data (8) Data (8) Data (8) Data (8)
ในสีแดงๆ นันเราเพิ
้ ม่ ก้ อน Data ให้ เป็ น Word (เราจะเรี ยกตามศัพท์ของ Memory ว่า Block เพราะต่อไปอาจมี block ที่ขนาดไม่ใช่ 4 byte)
และยก 2 bits จาก index มาให้ byte address แทน
Associative Cache
เพื่อลด Cache Miss เราจะเพิ่มจานวน Tags Per Line ขึ ้นมา ถ้ าเรามี 2 tags per line ก็จะเรี ยกว่ามันคือ “2-way Association” ปกติเรา
นิยมทา 4-way มากที่สดุ เพราะมีความสมดุลระหว่าง ”ความเร็ ว” กับ “ความชัวร์ ”
ทังนี
้ ้ L1 Cache ต้ องการความเร็ วสูงมาก มากขนาดว่า 4-way ก็ไม่นิยมใช้ เท่าที่ควร เรามาดูโจทย์กนั เลยดีกว่า
โจทย์: กาหนดให้ cache ขนาด 4kB เป็ นแบบ 4-way set associative และให้ มีจานวน blocks ต่อ 1 set เท่ากับ 16 จงคานวณหาจานวน
bits ของ address ขนาด 32 bit ที่ใช้ สาหรับ tag, byte offset, block offset และ index
แผนการ:
Index
Block
Byte
Tag (22)
(6)
4096 Bytes * 1/16 Sets/Block * 1/4 Block/Bytes = 64 Sets
...
Index-1 V Tag (22) Block Block Block Block Tag (22) Block Block Block Block
Tag (22) Block Block Block Block Tag (22) Block Block Block Block
Index V Tag (22) Block Block Block Block Tag (22) Block Block Block Block
Tag (22) Block Block Block Block Tag (22) Block Block Block Block
Index+1 V Tag (22) Block Block Block Block Tag (22) Block Block Block Block
Tag (22) Block Block Block Block Tag (22) Block Block Block Block
...
Memory Trade-Off
Pros
o เพิ่ม Spatial Locality = Less cache miss โดยเฉพาะใน array
Cons
o ลดขนาดของ entries ใน cache ถ้ าโปรแกรมไม่มี spatial locality จะทาให้ miss มากแทน
o warm-up นาน ต้ อง optimize ...
o critical-word first คือ เอาของจาเป็ นที่สดุ มาก่อน ที่เหลือค่อยๆ ตามมา
o early restart
Example
กรณี CPU clock rate = 500MHz ถ้ ารันโปรแกรมที่มี ALU 50%, Branch 20%, Load-Store 30% โดยที่ Load-Store มี miss rate = 5%,
miss stall time = 60ns (30 cycles!)
ในกรณีที่ miss หมด (เหมือนกับว่าไม่มี cache เลย ทุกอย่างต้ อง load/store ผ่าน memory หมด)
สังเกตได้ วา่ ต่างกันเกือบ 10 เท่า !! เมพไหมล่ะ เมพไหมล่ะ !!
Type of Misses
Cold Miss เกิดจากค่ามันไม่มีอยูใ่ นตอนแรก เป็ น miss ที่เลีย่ งไม่ได้
Conflict Miss เกิดจากปั ญหาเรื่ อง indexing บังคับให้ คา่ ทับกันไปมา มีเฉพาะใน cache ที่ไม่ใช่ fully associative cache
Capacity Miss คือ miss ที่ไม่ได้ เกิดจากสองอันแรก เกิดเฉพาะใน fully associative cache
Try a Problem!
Consider the following function:
byte offset 2 bit (4 bytes per word), block offset 2 bit (4 words per block) และเติม address อีก 3 bit จะได้ อ้างได้ ครบ 128 bytes
Addresses
y: tag=4, index=0
0000 0000 0000 0000 0000 0010 0 : 000 : 00 : 00
s: tag=5, index=2
0000 0000 0000 0000 0000 0010 1 : 010 : 00 : 00
หลักการทางาน:
p1 p2 p3 p1 p2 ... pn
$ $ $ $ $ $
คือปั ญหาที่เกิดจากการมี shared mem แต่ทกุ คนต่างโหลด cache ตัวเองของใครของมัน พอมีการเซฟค่ากลับลงใน cache ทาให้ ค่าที่ได้ ไม่
สัมพันธ์กนั
A: เอาเป็ นว่า x=5 นะ
B,C: อื ้อ
2 นาทีผา่ นไป...
A: เซฟค่าล่ะนะ x=7
3 นาทีผา่ นไป
อารมณ์ประมาณนัน้ ทางแก้ หนึง่ ที่นา่ ลองคือ write-through ให้ หมดเลย แต่ปัญหาคือไม่สามารถไป update cache ของเพื่อนๆ ได้ ด้วย แล้ ว
จะทายังไงให้ cache มีการ update ได้ เหมือนกันทุกคน?
Multicore Challenges
สรุ ป หน้ าที่ของมันคือ ทุกๆ clock positive edge ถ้ า r = 0 ให้ B = 0, otherwise B = A ซึ่งก็คือบทบาทเดียวกับ D-Flip-Flop นัน่ เอง เราจะ
ทาโจทย์ตอ่ ไปโดยเอา DFF (ต่อไปนี ้เรี ยก whatisme ว่า DFF นะ) มาสร้ างต่อ
D SET
Q
D Q
clk
CLR Q
ผลที่ได้ คือ มี DFF อันนึงอยู่ข้างใน ผลลัพธ์ D ที่ออกมา การทางานของมันคือมันจะเปลี่ยนค่า 1-0-1-0 ทุกครัง้ ที่มีสญ
ั ญาณ 1 ใส่เข้ ามา
(เพราะมัน xor กับ memory) เรี ยกสิง่ นี ้ว่า Parity Checker
SET out
D Q q
clk
CLR Q
reset
in
ต่อๆๆ
module whatisme3 (clk, enable, reset, out)
input clk, reset, enable;
output out;
reg out;
always @ (posedge clk)
if(reset)
out = 0;
else if (enable)
out = !out;
endmodule;
ก็คือเราครอบลงไปอีกชันอะ
้
Problem 1
รูปแบบคาสัง่ ที่เขาต้ องการพิจารณาคือ
lw $2, 4($1)
sw $2, 8($1)
เราจะสร้ าง forwarding network มาช่วย (กาจัด Stall) ได้ หรื อไม่ อย่างไร
Problem 2
การทางานของ CPU นัน้ สัญญาณแต่ละตัวมีหน้ าที่ตา่ งกันไป
Problem 3
สัญญาณ control จะกระจายไปตาม state ต่างๆ
Cut 2 จะมีผลกรณี data hazard ที่ต้องใช้ forwarding ในการแก้ ไข ส่วน Cut 3 กระทบกับคาสัง่ branch / jump ทังหมด
้
คาสัง่ ที่ทางานได้
sw $2, 0($10)
sw $3, 4($10)
sw $4, 8($10)
lw $2, 10($1)
add $3, $2, $4
sub $4, $3, $1
addi
subi
beq
New Problem!
พิจารณาชุดคาสัง่ ต่อไปนี ้
I1 = lw $1, 40($6)
I2 = add $2, $3, $1
I3 = add $1, $6, $4
I4 = sw $2, 20($4)
I5 = and $1, $1, $4
ถ้ าส่งคาสัง่ ชุดนี ้เข้ าไปใน MIPS 5-stage pipeline ที่ไม่มี hazard detection และไม่มี forwarding จงใส่ nop เพื่อให้ ชดุ คาสัง่ นี ้ทางานถูกต้ อง
(ใส่ให้ น้อยที่สดุ )
lw $1, 40($8)
nop (no operation)
nop
add $2, $3, $1
add $1, $6, $4
nop
sw $2, 20($4)
and $1, $1, $4
add ต้ องรอให้ lw วิ่งมาจน WB ก่อนจึงจึเข้ า EXE ได้ นัน่ คือต้ องห่างกัน 2 instruction และ add กับ sw ต้ องรอให้ add วิ่งไปถึง MEM ก่อน
SW ถึงจะเริ่ มได้ นัน่ คือห่างกัน 1 instruction
ทาต่อ ถ้ ามี hazard detection + forwarding จงเติม pipeline diagram และบอกว่าจะจบในกี่ cycle
T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11
I1 IF ID EXE MEM WB
I2 IF ID STALL EXE MEM WB
I3 IF STALL ID EXE MEM WB
I4 IF ID EXE MEM WB
I5 IF ID EXE MEM WB
แล้ วถ้ าไม่มี hazard detection? ก็จะเกิดปั ญหาตอน execute I2 ต่อจาก I1 ทันที ค่า $1 จะ forward ไม่ทนั (เพราะมันไม่มีใครมาควบคุมว่า
ต้ อง stall เมื่อไหร่!)
ทังนี
้ ้ MIPS เป็ น in-order processor จึงมี data hazard ได้ แค่แบบเดียวคือ read-after-write (RAW)
Control Hazard
เป็ น Hazard ที่จะทาให้ ประสิทธิภาพของ pipeline ลดลงเนื่องจากไม่สามารถกาหนดทิศทางของคาสัง่ ต่อไปหลังคาสัง่ Branch ได้ แน่นอน
Delayed Branch
เป็ นงานของ compiler ที่จะเรี ยงโค้ ดให้ สงิ่ ที่ไม่เกี่ยวกับ branch มาอยูต่ อ่ จาก branch
Hardware จะไม่ทาอะไร
พิจารณาชุดคาสัง่ ต่อไปนี ้
Case I: add กับ sw ไม่ใช่ delayed branch ที่ถกู ต้ อง ก็ต้องใส่ nop หลัง branch ทังหมดเลย
้
T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11
I1 IF ID EXE MEM WB
I2 IF ID EXE MEM WB
nop IF ID EXE MEM WB
I4 IF ID EXE MEM WB
Branch Taken!
nop IF ID EXE MEM WB
I5 IF ID EXE MEM WB
I6 IF ID EXE MEM WB
ต่อไปเป็ น Case II: add กับ sw เป็ น delayed branch
T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11
I1 IF ID EXE MEM WB
I2 IF ID EXE MEM WB
I3 IF ID EXE MEM WB
Delayed Slot!
I4 IF ID EXE MEM WB
I5 IF ID EXE MEM WB
I6 IF ID EXE MEM WB
ลองมาดูเคสต่อไปกันดีกว่า!
lw $1, 8($2) //Stall Warning!
add $2, $1, $5
sub $8, $9, $10 //Stall Warning!
addi $7, $8, 50
beq $9, $10, tgt
lw $10, 8($1) //Stall Warning!
tgt; or $12, $10, $10
นี่เป็ นโค้ ดที่มีปัญหาเรื่ องการลาดับโปรแกรม เราต้ องสลับลาดับโปรแกรม หาวิธีจดั การกับปั ญหา hazards ให้ ได้ มากที่สดุ
ปั ญหาคือ beq -> lw -> tgt เพราะมันใช้ $10 หมดเลย แนวคิดที่ปลอดภัยที่สดุ คือเราเอาสิ่งที่อยู่ก่อน branch และเป็ นสิ่งที่ยงั ไงก็ต้องทามา
ใช้ เป็ นการแก้ control hazard ส่วนการแก้ data hazard ทาได้ ง่ายมากโดยการสลับ I2 <-> I3
โปรแกรมใหม่จะเป็ น
lw $1, 8($2)
sub $8, $9, $10
add $2, $1, $5
beq $9, $10, tgt
addi $7, $8, 50
lw $10, 8($1) //Stall Warning!
tgt; or $12, $10, $10
แต่ก็ยงั มีปัญหา (อย่าคิดว่ามันง่าย!) เราต้ องแก้ โดยการเอา add มาไว้ ในตาแหน่งคัน่ lw กับ or แต่วา่ เราต้ องทาให้ add ทางานไม่วา่ จะ
taken หรื อ not taken เราจึงต้ องย้ ายตัว tgt ขึ ้นมาไม่ให้ โดนข้ าม โปรแกรมที่ถกู ต้ องจึงเป็ น
lw $1, 8($2)
sub $8, $9, $10
beq $9, $10, tgt
addi $7, $8, 50
lw $10, 8($1)
tgt: add $2, $1, $5
or $12, $10, $10
ทังนี
้ ้ ในบางกรณีไม่สามารถทาได้ จริ งๆ ก็มี ต้ องยอมรับและปล่อยให้ stall ไป
Basics of Cache
เราจะอ้ างถึง cache กันเป็ น block (1 block มีได้ หลาย byte ที่อยูใ่ นรูปของ 2^n)
ในแต่ละ block จะมีจานวน byte ที่จะถูก address ได้ เป็ นกาลังของสอง (1,2,4,8,...)
o ปกติเราจะนิยมให้ byte/block มากกว่า 1 เพราะ spatial locality ซึง่ ชัดเจนมากในระดับไบต์ เพราะตัวแปรมักเป็ นตัวแปร
ขนาด 4 byte
สาหรับ n-way set associative cache ใน 1 set จะมี n blocks
An Example
32-bit address, 128kB Direct-mapped cache. 16 bytes per block.
Offset
Tag (15) Index (13) (4)
Block 0 Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte
Block 1 Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte
Block 2 Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte
...
Block 213-1 Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte Byte
แต่เอาเข้ าจริ งๆ เรานิยมแบ่งข้ อมูลให้ เป็ น Words มากกว่า (เวลาเราทางานส่วนใหญ่ก็ 32-bit) ดังนัน้ เมื่อเรามี 4 bytes มาติดๆ กัน เราก็จะ
รวมมันเป็ น 1 Word ดังนัน้ เราจะต้ อง ”เสียสละ” Offset ของเรามาเป็ น “Byte Offset” 2 bit และเรี ยกที่เหลือว่า “Word Offset” แทน
...
New Problem!
Address 32 bits, 8-way set associative
# blocks = 16
จงหา
Offset bits
Index bits
Tag bits
Size of Cache
มันเริ่ มยาก เพราะนี่เป็ น 8-way set associative คาว่า 8-way หมายถึงเรามี 8 blocks per set ดังนัน้
เนื่องจากเรามีแค่ 2 sets เราใช้ บิตเดียวก็มากเพียงพอที่จะเลือกว่าจะเอา set ไหน จึงตอบว่า 1 bit สาหรับ index bits และที่เหลือจะ
กลายเป็ น tag โดยอัตโนมัติ คือ 32-5-1 = 26
Offset
Tag (26) I (5)
MUX
ADD ADD
Shift
4
Left 2
RegDst
Branch
MemRead
Control MemtoReg
ALUOp
MemWrite
ALUSrc
RegWrite
Read
Instr[25:21]
Reg.1 Read
PC Read Address
Read data 1
Instr[20:16] Zero
Reg.2
Instr. 0
Read
data 2
Write 0 Result Address
Memory Instr[15:11]
MUX
Reg.
MUX
Read 0
Write
Data
Data MUX
Registers Write
Data
Sign
ALU
Instr[15:0] Extend
Control
(16->32)
Instr[5:0]
Instruction Signals
Instruction RegDst ALUSrc MemtoReg RegWrite MemRead MemWrite Branch ALUOp1 ALUOp2
R-Format 1 0 0 1 0 0 0 1 0
lw 0 1 1 1 1 0 0 0 0
sw X 1 X 0 0 1 0 0 0
beq X 0 X 0 0 0 1 0 1
Instruction Formats
R-Type 0 rs rt rd shamt funct
5 bits 5 bits 5 bits
Load/Store 35 or 43 rs rt address
Branch 4 rs rt address
6 bits 5 bits 5 bits 15 bits
Appendix B: Division of Regions in Single-Cycle and Pipelined CPU
0
MUX
ADD ADD
Shift
4
Left 2
RegDst
Branch
MemRead
Control MemtoReg
ALUOp
MemWrite
ALUSrc
RegWrite
Read
Instr[25:21]
Reg.1 Read
PC Read Address
Read data 1
Instr[20:16] Zero
Reg.2
Instr. 0
Read
data 2
Write 0 Result Address
Memory Instr[15:11]
MUX
Reg.
MUX
Read 0
Write
Data
Data MUX
Registers Write
IF ID/REG EXE/ALU Data
MEM WB
Sign
ALU
Instr[15:0] Extend
Control
(16->32)
Instr[5:0]
Hazard
Detection
FLUSH
WB
M
Control
0
U M WB
X EX M WB
4 <<2
M
U
M M
Instruction Registers = X
U PC Memory U
M Memory M
X X
U U
X X
Signed-
Extend
M
U
X
Forwarding
Unit
คาเตือน: ไม่รับประกันความถูกต้ อง สาหรับ Pipeline Diagram ดูได้ ที่ Patterson & Hennessy p.370
Boilerplate
เอกสารบันทึกนี ้บันทึกจากการสอนวิชา 01204225 Computer Architecture & Organization เฉพาะช่ วงหลังสอบกลางภาค โดย อาจารย์
ดร.ภารุจ รัตนวรพันธุ์ ภาควิชาวิศวกรรมคอมพิวเตอร์ มหาวิทยาลัยเกษตรศาสตร์ ในภาคปลาย ปี การศึกษา 2553
จดบันทึกโดย LunaticNeko CPE23 และนาออกสูส่ าธารณะในวันที่ 27 พฤษภาคม 2554 หากต้ องการแจ้ งข้ อผิดพลาดใดๆ กรุณาอีเมล์แจ้ งที่
chawanat.n [at] gmail [dot] com (กรุณาอย่าใช้ ช่องทางอื่นแม้ จะทราบ เนื่องจากไม่ได้ ดแู ลทุกช่องทาง) จักเป็ นพระคุณยิ่ง