ขอให้สมาชิกรณรงค์ ในเรื่องการใช้คำให้สุภาพ และ งดการกล่าวถึง สถาบันที่สำคัญต่างๆ เช่น สภาบันชาติ ศาสนา พระมหากษัตริย์ รวมถึง สถาบันการเมือง สถาบันการศึกษาทุกแห่ง
-ขอบคุณครับ-
ขอให้สมาชิกรณรงค์ ในเรื่องการใช้คำให้สุภาพ และ งดการกล่าวถึง สถาบันที่สำคัญต่างๆ เช่น สภาบันชาติ ศาสนา พระมหากษัตริย์ รวมถึง สถาบันการเมือง สถาบันการศึกษาทุกแห่ง
-ขอบคุณครับ-
ในขณะที่เรากำลังจะสอบในเร็ววันนี้ ทางอาจารยืในคณะได้มีการจัดอบอรม วิชาแคลคูลัส ^^
บทแทรก 10-ก: สแต็ก
สแต็ก คือกลุ่มของข้อมูลที่มีการเรียงลำดับเอาไว้ และสามารถนำข้อมูลไปใช้ได้ครั้งละหนึ่งตัว จุดที่สามารถติดต่อกับข้อมูลได้เรียกว่า ส่วนหัวของสแต็ก จำนวนข้อมูลที่เก็บไว้ในสแต็กนั้นสามารถเปลี่ยนแปลงได้ ข้อมูลอาจจะถูกเพิ่มเข้าไปหรือนำออกจากส่วนหัวของสแต็กเท่านั้น ด้วยเหตุผลนั้นสแต็กจึงถูกเรียกว่า pushdown list หรือ last-in-first-out list
สแต็กเป็นโครงสร้างข้อมูลที่มีประโยชน์ต่อการสร้างซีพียูขึ้นมาใช้งาน ถ้ากลไกของสแต็กถูกนำไปใช้โดยซีพียู เช่นการนำไปใช้จัดการการเรียกใช้โพรซีเยอร์ก็ทำให้ไม่มีความจำเป็นจะมีคำสั่งทำงานกับสแต็กไว้ในชุดคำสั่งเครื่อง แต่ในทั้งสองกรณีการสร้างสแต็กนั้นจะต้องมีการอ้างอิงถึงตำแหน่งที่เก็บข้อมูลในสแต็ก
หน่วยความจำผืนหนึ่งในหน่วยความจำหลัก หรือในหน่วยความจำเสมือนจะถูกจองไว้สำหรับสแต็กส่วนใหญ่แล้วเนื้อที่ที่เตรียมไว้มักจะมีข้อมูลส่วนหนึ่งเก็บอยู่ และส่วนที่เหลือนั้นเตรียมไว้ใช้เก็บข้อมูลเพิ่มเติม
การบริหารสแต็กให้เหมาะสมนั้น จะต้องใช้การอ้างอิงตำแหน่งสามแห่งด้วยกัน ดังนี้
1. Stack pointer : หรือตัวชี้ตำแหน่งสแต็ก เป็นตัวเก็บตำแหน่งที่อยู่ของข้อมูลตัวบนสุดในสแต็ก ถ้ามีการเพิ่มข้อมูลเข้ามาหรือดึงข้อมูลออกไป ก็จะต้องเปลี่ยนตำแหน่งที่อยู่ให้ชี้อยู่ที่ข้อมูลตัวบนสุดเสมอ
2. Stack base: หรือตัวชี้ตำแหน่งฐาน เป็นตัวเก็บตำแหน่งที่อยู่ฐานของสแต็กในพื้นที่หน่วยความจำที่สงวนไว้ ถ้ามีการพยายามถึงข้อมูล (POP) ออกจากสแต็กที่ไม่มีข้อมูลอยู่ (stack pointer = stack base) ก็จะทำให้เกิดข้อผิดพลาดขึ้น
3. Stack limit : หรือขนาดของสแต็ก จะเป็นตัวเก็บตำแหน่งสุดท้ายที่สงวนไว้ใช้สำหรับสแต็ก ถ้ามีการพยายามใส่ข้อมูล (PUSH) เข้ามาในสแต็กที่เต็มแล้ว (stack pointer = stack limit) ก็จะทำให้เกิดข้อผิดพลาดขึ้น
ข้อดีของรูปแบบ postfix หรือ reverse Polish อีกประการหนึ่งคือ สามารถนำมาคำนวณหาค่าโดยนำสแต็กมาช่วยได้อย่างง่ายดาย นิพจน์จะถูกอ่านเข้ามาจากซ้ายไปขวา ข้อมูลแต่ละตัวที่อ่านเข้ามานั้นจะถูกกระทำดังนี้
1. ถ้าตัวที่ถูกอ่านเข้ามาเป็น ตัวแปร หรือค่าคงที่ ให้ใส่ตัวนั้น (PUSH) ลงในสแต็ก
2. ถ้าตัวที่ถูกอ่านเข้ามาเป็น เครื่องหมาย ให้อ่านค่าจากสแต็ก (POP) ขึ้นมาสองตัว ทำการคำนวณค่า และใส่ผลลัพธ์กลับลงไปในสแต็ก
กระบวนการแปลงนิพจน์ในรูปแบ infix ให้ไปอยู่ในรูปแบบ postfix นั้นก็สามารถทำได้ง่าย โดยนำสแต็กเข้ามาช่วย นิพจน์ infix จะถูกอ่านเข้ามาจากซ้ายไปขวา รูปแบบ postfix จะถูกสร้างขึ้นมาเป็นผลลัพธ์ในขณะที่อัลกอริทึมกำลังทำงาน
1. ตรวจข้อมูลตัวต่อไปที่ถูกอ่านเข้ามา
2. ถ้าเป็นตัวถูกกระทำ (operand) ให้ส่งออกเป็นผลลัพธ์
3. ถ้าเป็นเครื่องหมายวงเล็บเปิด ให้ใส่ลงไปในสแต็ก
4. ถ้าเป็นตัวกระทำ (operator) ให้ทำดังนี้
– ถ้าตัวกระทำตัวบนสุดในสแต็กเป็นเครื่องหมายวงเล็บเปิด ให้ใส่ตัวกระทำนั้นลงไปในสแต็ก
– ถ้าตัวกระทำมีค่า precedence สูงกว่าตัวบนสุดในสแต็ก ให้ใส่ตัวกระทำนั้นลงไปในสแต็ก
– มิฉะนั้น ให้อ่านตัวกระทำออกมาจากสแต็ก และส่งออกไปเป็นผลลัพธ์ตัวต่อไป และทำซ้ำในขั้นตอนที่ 4
5. ถ้าเป็นเครื่องหมายวงเล็บปิด ให้อ่านตัวกระทำออกมาจากสแต็ก และส่งออกไปเป็นผลลัพธ์ตัวต่อไปจนกว่าจะพบเครื่องหมายวงเล็บเปิด ให้ทิ้งเครื่องหมายนั้นทิ้งไปและอ่านตัวต่อไปเข้ามา
6. ถ้ายังมีตัวต่อไปให้กลับไปทำขั้นตอนที่ 1
7. ถ้าไม่มีตัวต่อไปแล้ว ให้อ่านตัวกระทำออกมาจากสแต็ก และส่งออกไปเป็นผลลัพธ์ตัวต่อไปจนหมดสแต็ก
ปัญหาที่น่าสนใจอย่างหนึ่งคือ ข้อมูลในไบต์ต่าง ๆ ของขนาดข้อมูล word หรือใหญ่กว่านี้มีวิธีการจัดเรียงอย่างไร นิยามของ endianness ได้รับการแนะนำโดย Cohen ในราวปี พ.ศ. 2524 ซึ่งได้อธิบายเกี่ยวกับลำดับของไบต์ในข้อมูลขนาดหลายไบต์ และวิธีการคำนวณค่าของข้อมูลจำนวนนั้น สมมุติว่ามีข้อมูลขนาด 32 บิต ซึ่งมีค่าฐานสิบหกเป็น 12345678 ซึ่งถูกเก็บไว้ในหน่วยความจำหนึ่ง word ขนาด 32 – bit ที่ตำแหน่ง 184 ในเครื่องคอมพิวเตอร์ที่สามารถอ้างอิงข้อมูลในระดับไบต์ได้ (เรียกว่า byte=addressable memory)ค่าของเลขจำนวนนี้เกิดจากข้อมูลขนาด 4 ไบต์ซึ่งไบต์ต่ำสุด (lest singificant) จะเก็บค่า 78 และไบต์สูงสุด(most significant byte) จะเก็บค่า 12 คำถามคือจะเก็บข้อมูลนี้ในหน่วยความจำคอมพิวเตอร์อย่างไร คำตอยที่เป็นไปได้มีอยู่สองวิธีดังนี้
ทั้งสองรูปแบบนี้จะเป็นรูปแบบกลับกันของกันและกัน
ในการเรียงลำดับแต่ละบิตภายในไบต์ มีปัญหาที่จะต้องพิจารณาสองประการคือ
- จะเริ่มนับบิตแรกเป็นบิตลำดับที่ “0” หรือลำดับที่ “1”
- เป็นแบบ little endian (บิตที่มีค่าน้อยที่สุดเป็นบิตแรก) หรือ big endian (บิตที่มีค่ามากที่สุดเป็นบิตแรก)
สมาชิกกลุ่ม
10.5 ชนิดของการทำงานในซีพียู Pentium
ซีพียู Pentium มีการทำงานชนิดที่สลับซับซ้อนมากมาย รวมทั้งคำสั่งพิเศษอีกจำนวนหนึ่ง วัตถุประสงค์ของการจัดเตรียมคำสั่งที่หลายหลายนี้ ก็เพื่อช่วยให้นักพัฒนาโปรแกรมตัวแปลภาษาสามารถทำงานได้อย่างสะดวกสบาย และสามารถแปลโปรแกรมภาษาระดับสูงมาเป็นภาษาเครื่องได้อย่างมีประสิทธิภาพ ตาราง 10.8 แสดงให้เห็นการทำงานชนิดต่าง ๆ พร้อมทั้งตัวอย่างประกอบคำสั่งส่วนใหญ่สามารถพบได้ในชุดคำสั่งภาษาเครื่องทั่วไป บางส่วนก็ถูกออกแบบให้เหมาะสมกับสถาปัตยกรรมซีพียูในตระกูล 80X86/Pentium
คำสั่ง Call/Return
ซีพียู Pentium จัดเตรียมคำสั่งสนับสนุนการ call/return ไว้สี่แบบคือ CALL, ENTER, LEAVE และ RETURN จากรูป 10.9 แสดงให้เห็นวิธีการ call/return ที่ใช้โดยทั่วไปจะเป็นการทำงานโดยใช้ stack frame เมื่อโพรซีเยอร์ใหม่ถูกเรียกใช้ จะเกิดการทำงานดังต่อไปนี้ก่อนที่ซีพียูจะไปประมวลผลคำสั่งในโพรซีเยอร์ที่ถูกเรียก
คำสั่ง CALL จะใส่ (push) ตำแหน่งของคำสั่งในปัจจุบัน (program counter) ไว้ในสแต็ก และทำให้เกิดการกระโดดไปทำงานในจุดเริ่มต้นของโพรซีเยอร์ที่ถูกเรียกด้วยการใส่ตำแหน่งที่นต้องการนั้นไว้ในตำแหน่งคำสั่งปัจจุบัน ในซีพียู 8088 และ 8086 โพรซีเยอร์ทั่วไปเริ่มต้นด้วยชุดคำสั่งนี้
PUSH EBP
MOV EBP, ESP
SUB EAP, space_for_locals
โดยที่ ESP คือตัวชี้ตำแหน่งเฟรม (frame pointer) และ ESP คือ ตัวชี้วัดตำแหน่งสแต็ก (stack pointer) ส่วนในซีพียู 80286 และรุ่นหลังจะมีคำสั่ง ENTER เพื่อทำงานตามที่กล่าวถึงนี้ได้ด้วยคำสั่งเดียว
คำสั่ง ENTER ถูกเพิ่มเข้าไปในชุดคำสั่ง เพื่อสนับสนุนการทำงานของโปรแกรมตัวแปลภาษา (compiler) โดยตรง คำสั่งนี้ยังสนับสนุนการเรียกใช้โพซีเยอร์แบบซ้ำซ้อน (nested or recursive procedure) ในภาษาระดับสูง เช่น Pascal, COBOL และ Ada อย่างไรก็ตามกลับพบว่าควรใช้วิธีการอื่นในการจัดการเรื่องนี้ คำสั่ง ENTER ช่วยประหยัดเนื้อที่หน่วยความจำได้เล็กน้อยเมื่อเปรียบเทียบกับคำสั่ง PUSH, MOV, และ SUB รวมกัน
ตาราง 10.8 ชนิดคำสั่งสำหรับซีพียู Pentium พร้อมตัวอย่าง
| Instruction | Description |
| Data Movement | |
| MOV | Move operand, between registers or between register and memory. |
| PUSH | Push operand onto stack. |
| PUSHA | Push all registers on stack |
| MOVSX | Move byte, word, dword, sign extended. Moves a byte to a word or a word to a doubleword with twos-complement sign extension. |
| XLAT | Table lookup translation. Replaces a byte in AL with a byte from a user-coded translation table. When XLAT is executed, AL should have and unsigned index to the table. XLAT changes the contents of AL from the table index to the table entry. |
| IN, OUT | Input, output operand from I/O space. |
| Arithmetic | |
| ADD | Add operands. |
| SUB | Subtract operands. |
| MUL | Unsigned integer multiplication, with byte, word, or double word operands, and word, doubleword, or quadword result. |
| IDIV | Signed divide. |
| Logical | |
| AND | AND operands. |
| BTS | Bit test and set. Operates on a bit field operand. The instruction copies the current value of a bit to flag CF and sets the original bit to 1. |
| BSF | Bit scan forward. Scans a word or doubleword for a 1-bit and stores the number of the first 1-bit into a register. |
| SHL/SHR | Shift logical left or right. |
| SAL/SAR | Shift arithmetic left or right. |
| ROL/ROR | Rotate left or right. |
| SETcc | Sets a byte to zero or one depending on any of the 16 conditions defined by flags. |
| Control Transfer | |
| JMP | Unconditional jump. |
| CALL | Transfer control to another location. Before transfer, the address of the instruction following the CALL is placed on the stack. |
| JE/JZ | Jump if equal/zero. |
| LOOPE/LOOPZ | Loops if equal/zero. This is a conditional jump using a value stored in register ECX. The instruction first decrements ECX before testing ECX for the breach condition. |
| INT/INTO | Interrupt/Interrupt if overflow. Transfer control to an interrupt service routine. |
| String Operations | |
| MOVS | Move byte, word, dword string, The instruction operates on one element of string, indexed by registers ESI and EDI. After each string operation, the registers are automatically incremented or decremented to point to the next element of the string. |
| LODS | Load byte, word, dword of string. |
| High-Level Language Support | |
| ENTER | Creates a stack frame that can be used to implement the rules of a block-structured high-level language. |
| LEAVE | Reverses the action of the previous ENTER. |
| BOUND | Check array bounds. Verifies that the value in operand 1 is within lower and upper limits. The limits are in two adjacent memory locations referenced by operand 2. An interrupt occurs if the value is out of bounds. This instruction is used to check an array index. |
| Flag Control | |
| STC | Set Carry flag. |
| LAHF | Load A register from flags. Copies SF, ZF, AF, PF, and CF bit into A register. |
| Segment Register | |
| LDS | Load pointer into D segment register.
System control. |
| HLT | Halt. |
| LOCK | Asserts a hold on shared memory so that the Pentium has exclusive use of it during the instruction that immediately follows the LOCK |
| ESC | Processor extension escape. An escape code that indicates the succeeding instructions are to be executed by a numeric coprocessor that supports high-precision integer and floating-point calculations. |
| WAIT | Wait until BUSY# negated. Suspends Pentium program execution until the processor detects that the BUSY pin is inactive, indicating that the numeric coprocessor has finished execution. |
| Protection | |
| SGDT | Store global descriptor table. |
| LSL | Load segment limit. Loads a user-specified register with a segment limit. |
| VERR/VERW | Verify segment for reading/writing. |
| Cache Management | |
| INVD | Flushes the internal cache memory. |
| WBINVD | Flushes the internal cache memory after writing dirty lines to memory. |
| INVLPG | Invalidates a translation look aside buffer (TLB) entry. |
(4 ไบต์ กับ 6 ไบต์) แต่ใช้เวลาในการประมวลผลนานกว่า (10 วงรอบนาฬิกา กับ 6 วงรอบนาฬิกา) ดังนั้นแม้ว่าอาจจะเป็นการดีที่นักออกแบบชุดคำสั่งจะเพิ่มคำสั่งนี้เข้าไปในชุดคำสั่ง แต่การกระทำดังกล่าวทำให้การสร้างซีพียูมีความยุ่งยากซับซ้อนมากยิ่งขึ้น โดยที่ได้ประโยชน์น้อยมากหรือไม่ได้รับประโยชน์เลย ในภายหลังได้ทราบว่าซีพียูในตระกูล RISC นั้นหลีกเลี่ยงที่จะสร้างคำสั่งที่มีความซับซ้อนมาก ๆ จึงไม่มีคำสั่งอย่าง ENTER นี้ใช้งาน ซึ่งสามารถใช้ชุดคำสั่งที่ง่ายกว่า แต่สามารถทำงานได้อย่างมีประสิทธิภาพสูงกว่า
การบริหารหน่วยความจำ
ชุดคำสั่งพิเศษอย่างหนึ่งเกี่ยวข้องกับการจัดการหน่วยความจำแบบ เซ็กเมนเตชัน (memory segmentation) คำสั่งในชุดนี้เป็นคำสั่งที่ต้องใช้สิทธิพิเศษจึงจะสามารถสั่งการได้ ซึ่งในที่นี้ก็คือจะถูกเรียกใช้โดยระบบปฏิบัติการเท่านั้น คำสั่งกลุ่มนี้ช่วยในการสร้างและอ่านข้อมูลตารางเซ็กเมนต์ (local and global segment tables or descriptor) และใช้ในการตรวจสอบและแก้ไขข้อมูบในตารางฯ
โค้ดเงื่อนไข
ดังที่ได้กล่าวถึงมาแล้ว โค้ดเงื่อนไข (condition codes) คือ บิตจำนวนหนึ่งที่เก็บอยู่ในรีจิสเตอร์พิเศษ ซึ่งจะถูกเปลี่ยนแปลงค่าโดยการทำงานบางอย่าง และถูกนำมาใช้กับคำสั่ง branch แบบต่าง ๆ เงื่อนไขเหล่านี้มักจะถูกกำหนดค่าหลังจากการประมวลผลคำสั่งทางคณิตศาสตร์และการเปรียบเทียบ (compare operation) ซึ่งในภาษาส่วนใหญ่จะเกิดขึ้นจากการนำตัวถูกกระทำมาลบออกจากกัน เหมือนกับที่เกิดขึ้นในการลบข้อมูลทางคณิตศาสตร์ ข้อแตกต่างกัน คือ การเปรียบเทียบนั้นจะมีผลต่อการกำหนดค่าโค้ดเงื่อนไขเท่านั้น ในขณะที่กาลบจะนำผลลัพธ์ที่ได้ไปเก็บไว้ในตัวถูกกระทำที่ใช้เก็บตำแหน่งผลลัพธ์
ตาราง 10.9 โค้ดเงื่อนไขสำหรับซีพียู Pentium
| Status Bit | Name | Description |
| C | Carry | Indicates carrying or borrowing into the leftmost bit position following an arithmetic operation. Also modified by some of the shift and rotate operations. |
| P | Parity | Parity of the result of an arithmetic of logic operation. 1 indicates even parity; 0 indicated odd parity. |
| A | Auxiliary carry | Represents carrying of borrowing between half-bytes of an 8-bit arithmetic or logic operation using the AL register. |
| Z | Zero | Indicates that the result of an arithmetic of logic operation is 0. |
| S | Sign | Indicates the sign of the result of an arithmetic or logic operation. |
| O | Overflow | Indicates an arithmetic overflow after an addition or subtraction. |
ตาราง 10.10 เงื่อนไขสำหรับซีพียู Pentium สำหรับเงื่อนไขแบบ conditional jump และคำสั่ง SET
| Symbol | Condition Tested | Comment |
| A, NBE | C=AND Z=0 | Above; not below or equal (greater then, unsigned) |
| AE, NB, NC | C=0 | Above or equal; not below (greater than or equal, unsigned); not carry |
| B, NAE,C | C=1 | Below; not above or equal (less than, unsigned); carry set |
| BE, NA | C=1 OR Z=1 | Below or equal; not above (less than or equal, unsigned) |
| E, Z | Z=1 | Equal; zero (signed or unsigned) |
| G, NLE | [(S=1 AND O=1) OR (S=0 AND O=0)] AND [Z=0 | Greater than; not less than (signed) |
| GE, NL | (S=A AND O=1) OR (S=0 AND O=0) | Greater than or equal; not less than (signed) |
| L, NGE | (S=1 AND O=0) OR (S=0 AND O=1) | Less than; not greater than or equal (signed) |
| LE, NG | (S=1 AND O=0) OR (S=0 AND O=1) OR (Z=1) | Less than or equal; not greater than (signed) |
| NE, NZ | Z=0 | Not equal; not zero (signed or unsigned) |
| NO | O=0 | No overflow |
| NS | S=0 | Not sign (not negative) |
| NP, PO | P=0 | Not parity; parity odd |
| O | O=1 | Overflow |
| P | P=1 | Parity; parity even |
| S | S=1 | Sign (negative) |
การเปรียบเทียบนี้ ขี้นอยู่กับว่าเป็นตัวเลขแบบมีเครื่องหมายหรือไม่มีเครื่องหมาย เช่น เลขขนาด 8 บิต อย่าง 11111111(256) นั้นมีค่ามากกว่า 00000000(0) ถ้าเลขทั้งสองนี้เป็นแบบไม่มีเครื่องหมาย แต่ถ้าเป็นเลขที่มีเครื่องหมาย เลขตัวแรก (-1) จะมีค่าน้อยกว่า (0) ภาษาแอสเซมบลีบางส่วน จึงแยกความแตกต่างออกจากกันคือ ถ้าเป็นการเปรียบเทียบระหว่างตัวเลขแบบมีเครื่องหมายจะใช้คำว่า น้อยกว่า (less than) และมากกว่า (greater than) การเปรียบเทียบระหว่างตัวเลขแบบไม่มีเครื่องหมายจะใช้คำว่าต่ำกว่า (below) หรือเหนือกว่า (above)
สิ่งที่น่าสนใจอีกประการหนึ่งคือ ความซับซ้อนในการเปรียบเทียบตัวเลขที่มีเครื่องหมาย เครื่องหมายของผลลัพธ์จะมีค่ามากกว่าหรือเท่ากับ “0” ถ้า (1) บิตเครื่องหมายมีค่าเป็น “0” และไม่มี overflow เกิดขึ้น (S=0 and O=0) หรือ (2) บิตเครื่องหมายมีค่าเป็น “1” และมี overflow เกิดขึ้น
คำสั่ง MMX ในซีพียู Pentium
ในปี พ.ศ.2539 บริษัทอินเทลได้แนะนำเทคโนโลยี MMX ที่ได้ใส่เข้าไปในซีพียู Pentium เทคโนโลยี MMX ประกอบด้วยชุดคำสั่งชุดหนึ่งที่ได้รับการปรับปรุงประสิทธิภาพให้มีความเหมาะสมกับงานมัลติมีเดียโดยเฉพาะ คำสั่งทั้งหมดมีอยู่ 57 คำสั่งใหม่ที่ทำงานกับข้อมูลตามแบบสถาปัตยกรรม SIMD (single-instruction, multiple-data) ทำให้สามารถทำงานชนิดเดียวกัน เช่น การบวกหรือการคูณกับข้อมูลหนึ่งได้พร้อมกัน แต่ละคำสั่งโดยปกติจะใช้เวลาที่สามารถประมวลผลเพียงหนึ่งรอบนาฬิกาเท่านั้น สำหรับงานประยุกต์ที่เหมาะสมคำสั่งที่สามารถประมวลผลแบบขนานได้อย่างรวดเร็วนี้จะสามารถทำงานได้เร็วขึ้นตั้งแต่ 2 ถึง 8 เท่า เมื่อเปรียบเทียบกับอัลกอริทึมที่ทำงานอย่างเดียวกันแต่ไม่ได้คำสั่ง MMX นี้
จุดเด่นของคำสั่งในชุด MMX คือ การสนับสนุนการโปรแกรมมัลติมีเดีย (multimedia) ข้อมูลวีดีโอและข้อมูลเสียงประกอบด้วยข้อมูลขนาดเล็ก (8 บิต หรือ 16 บิต) เป็นจำนวนมากในขณะที่ข้อมูลสำหรับคำสั่งทั่วไปมักกระทำกับข้อมูลขนาด 32 บิต ถึง 64 บิต เช่น ภาพกราฟิกและวีดีโอจำนวนฉาก (scene) หนึ่งประกอบด้วยอาร์เรย์ของพิกเซล (pixel) จำนวนมาก ข้อมูลแต่ละพิกเซลมีขนาด 8 บิต ข้อมูลเสียง (audio) มักจะถูกแปลงเป็นข้อมูลขนาด 16 บิต สำหรับข้อมูลภาพหรือวีดีโอสามมิติ แต่ละพิกเซลมีขนาด 32 บิต เพื่อให้สามารถประมวลผลแบบขนานกับข้อมูลเหล่านี้ เทคโนโลยี MMX จึงได้สร้างข้อมูลชนิดใหม่ขี้นมาสามชนิด แต่ละชนิดมีความยาว 64 บิต ซึ่งประกอบด้วยเขตข้อมูลขนาดเล็กจำนวนหนึ่ง แต่ละเขตข้อมูลจะเป็นข้อมูลจำนวนเต็ม ข้อมูลทั้งสามชนิดได้แก่
ตาราง 10.11 แสดงชุดคำสั่ง MMX คำสั่งใหญ่จะเกี่ยวข้องกับการทำงานแบบขนานกับข้อมูลขนาด byte, word หรือ doubleword เช่น คำสั่ง PSLLW เป็นการเลื่อนบิตแบบตรรกะไปทางซ้ายซึ่งจะกระทำกับ word ทั้ง 4 word ของตัวถูกกระทำแบบ packed word พร้อมกัน คำสั่ง PADDB เป็นการอ่านข้อมูลนำเข้าจากตัวถูกกระทำแบบ packed byte แล้วทำการบวกแต่ละไบต์พร้อม ๆ กันเพื่อสร้างเป็นผลลัพธ์แบบ packed byte เช่นเดียวกัน
จุดเด่นประการหนึ่งที่ไม่ธรรมดาสำหรับชุดคำสั่งใหม่นี้คือ การแนะนำคณิตศาสตร์แบบอิ่มตัว (saturation arithmetic) สำหรับคณิตศาสตร์แบบปกติที่กระทำกับเลขจำนวนแบบไม่มี
ตาราง 10.11 คำสั่งในชุดคำสั่ง MMX
| Category | Instruction | Description |
| Arithmetic | PADD[B,W,D] | Parallel add of packed eight bytes, four 16-bit words, or two 32-bit doublewords, with wraparound |
| PADDS[B,W] | Add with saturation | |
| PADDUS[B,W] | Add unsigned with saturation | |
| PSUB[B,W] | Subtract with wraparound | |
| PSUBS[B,W] | Subtract with saturation | |
| PSUBUS[B,W] | Subtract unsigned with saturation | |
| PMULHW | Parallel multiply of four signed 16-bit words, with high-order 16 bits of 32-bit result chosen | |
| PMULLW | Parallel multiply of four signed 16-bit words, with low-order 16 bits of 32-bit result chosen | |
| PMADDWD | Parallel multiply of four signed 16-bit words, with together adjacent pairs of 32-bit result chosen | |
| Comparison | PCMPEQ[B,W,D] | Parallel compare for equality; result is mask of 1s if true of 0s if false |
| PCMPGT[B,W,D] | Parallel compare for greater than; result is mask of 1s if true or 0s if false | |
| Conversion | PACKUSWB | Pack words into bytes with unsigned saturation |
| PACKSS[WB,DW] | Pack words into bytes, or doublewords into words, with signed saturation | |
| PUNPCKH[BW,WD,DQ] | Parallel unpack (interleaved merge) high-order bytes, words, or doublewords from MMX register | |
| PUNPCKL[BW,WD,DW] | Parallel unpack (interleaved merge) low-order bytes, words, or doublewords from MMX register | |
| Logical | PAND | 64-bit bitwise logical AND |
| PNDN | 64-bit bitwise logical AND NOT | |
| POR | 64-bit bitwise logical OR | |
| PXOR | 64-bit bitwise logical XOR | |
| Shift | PSLL[W,D,Q] | Parallel logical left shift of packed words, doubleword, or quadword by amount specified in MMX register or immediate value |
| PSRL[W,D,W] | Parallel logical right shift of packed words, doublewords, or quadword | |
| PSRA[W,D] | Parallel arithmetic shift of packed words, doublewords, or quadword | |
| Data Transfer | MOV[D,Q] | Move doubleword or quadword to/from MMX register |
| State Mgt | EMMS | Empty MMX state (empty FP registers tag bits) |
| Note:If an instruction supports multiple data types [byte(B), word (W), quadword (Q), the data types are indicated in brackets. | ||
เครื่อง หมาย เมื่อเกิดการ overflow (มีเลขทดเกินหลังสูงสุด) บิตที่เกินไปนั้นจะถูกตัดทิ้งซึ่งเรียกว่าเป็นการทำ “wrap-around” เนื่องจากผลของการตัดบิตทิ้งนี้อาจทำให้ได้ผลลัพธ์ที่มีค่าน้อยกว่าตัวกระทำทั้งสองตัว ดูตัวอย่างจากการบวกเลขดังต่อไปนี้
F000h = 1111 0000 0000 0000
+300h = 0011 0000 0000 0000
10010 0000 0000 0000
1111 1111 1111 1111 = FFFFh
พิจารณาตั้วอย่างต่อไปนี้เพื่อให้เกิดความเข้าใจในการทำงานของคำสั่ง MMX การใช้งานวีดีโอมักจะไม่เกี่ยวข้องกับการที่เรียกว่า fade-in และ fade-out คือการที่ภาพหนึ่งกำลังค่อย ๆ หายไปและถูกแทนที่ด้วยภาพใหม่นั่นคือ การรวมภาพสองภาพเข้าด้วยกันโดยมีตัวถ่วงน้ำหนัก เช่น
Result_pixel = A_pixel × fade + B_pixel × (1-fade)
การคำนวณนี้จะเกิดขึ้นกับทุกพิกเซล ซึ่งแทนในสมการด้วย A-pixel และ B-pixel เฟรมชุดที่เกิดจากการเปลี่ยนแปลงนี้จะเริ่มต้นจากค่าของ “fade” ที่เริ่มต้นเป็น 1 และ ค่อย ๆ ลดลงจนถึง “0” จะทำให้ภาพที่เริ่มต้นจากภาพ A ค่อย ๆ เปลี่ยนเป็นภาพ B ในที่สุด
รูป 10.10 แสดงลำดับขั้นตอนที่เกิดขึ้นกับแต่ละพิกเซล พิกเซลแต่ละพิกเซลที่มีขนาด 8 บิต จะถูกเปลี่ยนไปเป็นข้อมูลขนาด 16 บิต เพื่อให้สอดคล้องกับความสามารถในการคูณข้อมูล 16 บิต ของ MMX ถ้าภาพขนาด 640 × 480 พิกเซล และถ้าแต่ละขั้นตอนของการเปลี่ยนภาพนั้นแบ่งออกเป็นทั้งหมด 225 ขั้นตอน (ค่าของ “fade”) แล้วจะทำให้มีจำนวนคำสั่งที่จะถูกประมวลผลเกิดขึ้นทั้งหมดประมาณ 535 ล้านครั้ง ในขณะที่การทำงานอย่างเดียวกันแต่ไม่ใช่เทคโนโลยี MMX จะเกิดการคำนวณขึ้นประมาณ 1.4 พันล้านครั้ง
ตาราง 10.12 คำสั่งในชุดคำสั่ง Power PC และตัวอย่างประกอบ
| Instruction | Description |
| Branch Oriented | |
| b | Unconditional branch |
| bl | Branch to target address and place effective address of instruction following the branch into the Link Register |
| bc | Branch conditional on Count Register and/or on bit in condition Register |
| sc | System call to invoke an operating system service |
| trap | Compare two operands and invoke system trap handler if specified conditions are met |
| Load/Store | |
| lwzu | Load word and zero extend to left; update source register |
| ld | Load doublewoed |
| lmw | Load multiple word; load consecutive words into contiguous registers from the target register through general0purpose register 31 |
| lswx | Load a string of bytes onto registers beginning with target register; 4 bytes per register; wrap around from register 31 to register 0 |
| Integer Arithmetic | |
| add | Add contents of two registers and place in third register |
| subf | Subtract contents of two registers and place in third register |
| mullw | Multiply low-order 32 bit contents of two registers and place 64-bit product in third register |
| divd | Divide 64-bit contents of two registers and place in quotient in third register |
| Logical and Shift | |
| cmp | Compare two operands and set four condition bits in the specifies condition register field |
| crand | Condition register AND : two bits of the Condition Register are ANDed and the result placed in one of the two bit positions |
| and | AND contents of two registers and place in third register |
| cntlzd | Count number of consecutive 0 bits starting at bit zero in source register and place count in destination register |
| rldic | Rotate left doubleword register, AND with mask, and store in destination register |
| sld | Shift left bits in source register and store in destination register |
| Floating Point | |
| lfs | Load 32-bit floating0point number from memory, convert to 64-bit format, and store in floating-point register |
| fadd | Add contents of two registers and place in third register |
| fmadd | Multiply contents of two registers, add the contents of third, and place result in fourth register |
| fcmpu | Compare two floating0point operands and set conditions bits |
| Cache Management | |
| dcbf | Data cache block flush; perform lookup in cache on specified target address and perform flushing operation |
| icbi | Instruction cache block invalidate |
ชนิดการทำงานในซีพียู PowerPC
ซีพียู PowerPC มีชุดคำสั่งที่มากมาย ตาราง 10.12 แสดงชนิดของคำสั่งและตัวอย่างประกอบคำสั่งเหล่านี้มีสิ่งที่น่าสนใจดังต่อไปนี้
คำสั่ง Branch-Oriented
ซีพียู PowerPC สนับสนุนคำสั่งกระโดดทั้งแบบ conditional branch และ unconditional branch แบบที่ไม่ธรรมดา คำสั่งกระโดดอย่างมีเงื่อนไขจะทำการทดสอบข้อมูลขนาด 1 บิต จากรีจิสเตอร์เงื่อนไขเพื่อสอบว่าเป็น “จริง” หรือ “ไม่ใช่ 0” หรือ “ไม่สนใจ” ทำให้มีเงื่อนไขที่เป็นไปได้ 9 เงื่อนไข เงื่อนไขสำหรับกำหนดเงื่อนไขกระโดด ถ้ารีจิสเตอร์ถูกทดสอบว่าเป็น “0” หรือ “ไม่ใช่ 0” จะมีผลให้รีจิสเตอร์นั้นถูกลดค่าลงไป “1” ก่อนที่จะเกิดการทดสอบ เงื่อนไขนี้ช่วยให้สะดวกต่อการสร้างโค้ดเพื่อการวนซ้ำ (loop)
คำสั่ง Load/Store
ในสถาปัตยกรรม PowerPC คำสั่งสำหรับการอ่านข้อมูลเข้ามา (load) และการจัดเก็บข้อมูล (store) เท่านั้นที่ได้รับอนุญาตให้ติดต่อกับหน่วยงานความจำได้ คำสั่งทางคณิตศาสตร์และตรรกะจะกระทำกับข้อมูลที่อยู่ในรีจิสเตอร์เท่านั้น กฎเกณฑ์เช่นนี้ถูกนำไปใช้กับสถาปัตยกรรมซีพียูแบบ RISC
ความแตกต่างระหว่าง load กับ store
สมาชิกกลุ่ม
เนื้อหาครบถ้วนดีคับ เข้าใจง่าย ขอบคุณคับ
เข้าใจง่าย แต่ หน้าจะมีภาพ ประกอบ จะน่าสนใจยิ่งขึ้น
รายชื่อสมาชิกในกลุ่ม ITR1
1.5401103075026 น.ส.ยลดา เรืองพรวิสุทธ์2.5401103075027 นาย ฉัตรชัย สามบุญเที่ยง3.5401103075021 นาย เมธา งามผ่อง4.5401103075047 นาย สิร ปิติวงศธร5.5401103075022 นาย บดินทร์ มีแววแสง6.5401103075003 น.ส.วิษณี แจ่มพิศ7.5401103075035 น.ส.สุนทรี แซ่ด่าน
4.1 หน่วยความจำในเครื่องคอมพิวเตอร์
คุณลักษณะของระบบหน่วยความจำ
ความซับซ้อนของระบบหน่วยความจำสามารถทำให้เข้าใจได้ง่ายขึ้นด้วยการอธบายคุณลักษณะที่สำคัญของระบบหน่วยความจำ
คำว่าสถานที่ (Location) หมายความถึงสถานที่ที่หน่วยความจำอยู่ นั่นคืออยู่ภายในหรือภายนอกเครื่องคอมพิวเตอร์ หน่วยความจำภายในเครื่องคอมพิวเตอร์ (internal memory) มักจะหมายถึง หน่วยความจำหลัก (main memory) แต่อันที่จริงยังควมีหน่วยความจำแบบอื่นอยู่อีกด้วย เช่น โปรเซสเซอร์ต้องการหน่วยความจำเป็นของตัวเองในรูปแบบของรีจิสเรตอร์ (register) และหน่วยควบคุมภายในโปรเซสเซอร์ก็อาจจำเป็นต้องใช้หน่วยความจำของตัวเอง หน่วยความจำทั้งสองแบบนี้จะกล่าวถึงในภายหลัง นอกจากนี้ภายนอกประกอบด้วยอุปกรณ์พ่วงต่อต่างๆ ได้แก่ ดิสก์และเทป ซึ่งโปรเซสเซอร์สามารถอ้างอิงถึงได้โดยผ่านหน่วยควบคุมไอโอ
คุณสมบัติที่ชัดเจนของหน่วยความจำคือ ความจุ (capacity) สำหรับหน่วยความจำภายใน
คุณสมบัติที่เกี่ยวข้องกับความจุคือ หน่วยในการถ่ายเทข้อมูล (unit of transfer) สำหรับหน่วยความจำภายใน หน่วยในการถ่ายเทข้อมูลเท่ากับ จำนวนสายสัญญาณข้อมูลเข้าสู่และออกจากหน่วยความจำ โดยปกติจะมีขนาดเท่ากับความยาวของ word แต่ก็อาจจะมีขนาดใหญ่กว่าก็ได้ เช่น 64, 128 หรือ 256 บิต เพื่อให้เกิดความเข้าใจมากยิ่งขึ้น ขอให้พิจารณานิยามที่เกี่ยวข้องกับหน่วยความจำภายในดังนี้
ความแตกต่างอีกอย่างหนึ่งของหน่วยความจำคือ วิธีการเข้าถึงหน่วยความจำ (method of accessing) ซึ่งมีรายละเอียดดังนี้
จากมุมมองของผู้ใช้ คุณลักษณะที่สำคัญสองประการของหน่วยความจำคือ ความจุ และประสิทธิภาพ มีวิธีการวัดประสิทธิภาพในสามเรื่องดังนี้
โครงสร้างลำดับขั้นตอนของหน่วยความจำ
เงื่อนไขในการออกแบบหน่วยความจำของเครื่องคอมพิวเตอร์ อาจถูกจัดแบ่งออกได้ด้วยคำถามสามคำถามคือ มีปริมาณเท่าใด และมีราคาเท่าใด
คำถามที่ว่าเครื่องคอมพิวเตอร์ควรจะมีหน่วยความจำเท่าใดนั้น มักจะไม่มีคำตอบที่ชัดเจน ไม่ว่าคอมพิวเตอร์จะมีปริมาณหน่วยความจำเท่าใดก็ตาม โปรแกรมประยุกต์ก็จะถูกพัฒนาให้สามารถใช้หน่วยความจำในปริมาณนั้นได้ทั้งหมดเสมอ ส่วนคำถามที่เกี่ยวข้องกับความเร็วของหน่วยความจำนั้นสามารถให้คำตอบได้ชัดเจนกว่า เพื่อให้เครื่องคอมพิวเตอร์มีประสิทธิภาพสูงที่สุด หน่วยความจำจะต้องสามรถทำงานให้ทันกับโปรเซสเซอร์ คือจะต้องสามรถส่งคำสั่งและข้อมูลให้โปรเซสเซอร์ทำการประมวลผลได้ตลอดเวลา โดยไม่ต้องมีการรอคอยเกิดขึ้น
องค์ประกอบที่สำคัญทั้งสามประการคือ ราคา ปริมาณ และเวลาการเข้าถึงหน่วยความจำได้มีความพยายามในการนำเทคโนโลยีใหม่ๆ เข้ามาใช้อยู่เสมอ แต่องค์ประกอบทั้งสามก็มีความสัมพันธ์กันดังนี้
ลักษณะพื้นฐานของหน่วยความจำ Cache
หน่วยความจำ cache สร้างขึ้นมาด้วยวัตถุประสงค์ที่จะให้เป็นหน่วยความจำที่ทำงานได้เร็วที่สุดเท่าที่เทคโนโลยีดีที่สุดในขณะนั้นจะทำได้ ในเวลาเดียวกันก็ต้องการให้มีขนาดใหญ่ที่สุดในราคาที่ไม่แพงจนเกินไปนัก แนวความคิดนี้ได้แสดงในเครื่องคอมพิวเตอร์มีหน่วยความจำหลักที่มีความเร็วต่ำ(เมื่อเปรียบเทียบกับความเร็วของซีพียู) ที่มีปริมาณมาก และมีหน่วยความจำ cache ที่เร็วกว่าแต่มีขนาดเล็กกว่า โดยปกติหน่วยความจำ cache จะเก็บสำเนาของข้อมูลบางส่วนในหน่วยความจำหลักเอาไว้ เมื่อโปรเซสเซอร์ต้องการอ่านข้อมูลจำนวนหนึ่ง word ในหน่วยความจำ ข้อมูลส่วนนั้นจะถูกตรวจสอบว่ามีอยู่ใน cache หรือไม่ ถ้ามีอยู่ก็จะนำข้อมูลใน cache ไปใช้ ถ้าไม่มีอยู่ก็จะเกิดการคัดลอกสำเนาข้อมูลหนึ่งบล็อก จากหน่วยความจำหลักมายัง cache แล้วจึงนำ word ที่ต้องการส่งต่อไปให้โปรเซสเซอร์ในภายหลังเนื่องจากปรากฏการณ์การอ้างอิงในพื้นที่เดียวกัน (locality of reference) จะทำให้การอ้างอิงข้อมูลในหน่วยความจำครั้งต่อๆ ไปเป็นการอ้างอิงที่เดิม หรือตำแหน่งที่ใกล้เคียงจุดเดิมดังนั้นการคัดลอกข้อมูลหนึ่งบล็อกจากหน่วยความจำหลักมายัง cache จะสามารถถูกนำมาใช้งานได้ในระยะหนึ่ง ก่อนที่จะมีการคัดลอกข้อมูลในครั้งต่อไป
4.2 ลักษณะพื้นฐานของหน่วยความจำ Cache
หน่วยความจำ cache สร้างขึ้นมาด้วยวัตถุประสงค์ที่จะให้เป็นหน่วยความจำที่ทำงานได้เร็วที่สุดเท่าที่เทคโนโลยีดีที่สุดในขณะนั้นจะทำได้ ในเวลาเดียวกันต้องการให้มีขนาดใหญ่ที่สุดที่ไม่แพงจนเกินไปนัก
มีหน่วยความจำ cache ที่เร็วกว่าแต่มีขนาดเล็กกว่า โดยปกติหน่วยความจำ cahe จะเก็บสำเนาของข้อมูลบางส่วนในหน่วยความจำหลักเอาไว้ เมื่อโปรเซสเซอร์ต้องการอ่านข้อมูลจำนวนหนึ่ง word ในหน่วยความจำ ข้อมูลส่วนนั้นจะถูกตรวจสอบว่ามีอยู่ใน cache หรือไม่ ถ้ามีอยู่ก็จะนำข้อมูลใน cache ไปใช้ ถ้าไม่มีอยู่ก็จะเกิดการคัดลอกสำเนาข้อมูลหนึ่งบล็อก จากหน่วยความจำหลักมายัง cache แล้วจึงนำ word ที่ต้องการส่งไปให้โปรเซสเซอร์ในภายหลัง
รูป 4.4 แสดงโครงสร้างของหน่วยความจำ cache และหน่วยความจำหลัก หน่วยความจำหลักประกอบด้วย ที่เก็บข้อมูลจำนวน 2 words ที่สามารถถูกอ้างอิงได้ โดยที่แต่ละ word จะมีหมายเลขที่อยู่เป็นเลขฐานสองจำนวน n-bit เป็นหมายเลขเฉพาะตัวเอง
รูป 4.5 การอ่านข้อมูลจากหน่วยความจำ cache
4.3 องค์ประกอบในการออกแบบ Cache
หัวข้อนี้กล่าวถึง เรื่องทั่วไปเกี่ยวกับองค์ประกอบที่เข้ามาเกี่ยวข้องในการออกแบบ cache และรายงานผลที่เกิดขึ้นให้ทราบ
ขนาดของ Cache
องค์ประกอบตัวแรกคือ ขนาดของ cache(cache size) ซึ่งได้กล่าวไปบ้างแล้ว โดยทั่วไปนักออกแบบต้องการให้ cache มีขนาดเล็กเพียงพอที่จะทำให้ราคาเฉลี่ยต่อบิตนั้นใกล้เคียงกับราคาของหน่วยความจำหลัก และต้องการให้มีขนาดใหญ่เพียงพอ เพื่อให้ค่าเฉลี่ยของเวลาในการเข้าถึงข้อมูลใกล้เคียงกับระยะเวลาในการเข้าถึงข้อมูลของ cache
ฟังก์ชันแม็บปิง
เนื่องจาก cache มีช่องสัญญาณน้อยกว่าจำนวนบล็อกในหน่วยความจำหลัก จึงจำเป็นต้องมีอัลกอริทึม สำหรับการกำหนดตำแหน่งหน่วยความจำของแต่ละบล็อก ไปยังช่องสัญญาณใน cache เรียกว่า การแม็บปิง (mapping) นอกจากนี้ ยังต้องมีวิธีการสำหรับการตรวจสอบว่าบล็อกใดที่ยังคงเก็บไว้ในช่องสัญญาณ cache
การจัดโครงสร้างภายใน cache แบบที่ง่ายที่สุดเป็นแบบ ไดเร็กแม็บปิง (Direct mapping) ซึ่งจะกำหนดตำแหน่งของแต่ละบล็อกไว้ที่ตำแหน่งของสัญญาณ cache ที่เดิมเสมอ ไม่มีการเปลี่ยนแปลง
เมื่อ
i คือ หมายเลขช่องสัญญาณ cache
j คือ หมายเลขบล็อก
m คือ จำนวนช่องสัญญาณของ cache
แอสโซซิเอทีฟแม็บปิง (Associative mapping) ได้แก้ปัญหาของไดเร็กแม็บปิงโดยยินยอมให้หน่วยความจำแต่ละบล็อก สามารถถูกอ่านเข้ามาไว้ใน cache ช่องใดก็ได้ในกรณีนี้ในการแปลงตำแหน่งที่อยู่จะแบ่งออกเป็นสองส่วนคือ ป้ายบอกตำแหน่ง (tag) และตำแหน่งของ word ป้ายบอกตำแหน่งใช้ในการบอกหมายเลขบล็อกของหน่วยความจำหลักการตรวจสอบว่าบล็อกนั้นอยู่ใน cache หรือไม่ ยังคงใช้วิธีการเดิมคือ การเปรียบเทียบค่าของป้ายบอกตำแหน่งที่มากับข้อมูล กับค่าของป้ายบอกตำแหน่งที่เก็บอยู่ใน cache ดังนั้นจึงไม่มีการตรวจสอบหมายเลขช่องสัญญาณใน cache ค่าต่างๆ สรุปได้ดังนี้
เซ็ตแอสโซซิเอทีฟแม็บปิง (Set associative mapping) เป็นวิธีการผสมที่ได้นำข้อดีของทั้งไดเร็กแม็บปิง และแอสโซซิเอทีฟแม็บปิงมาใช้ ในขณะที่พยายามลดข้อด้อยให้มีผลกระทบน้อยลง ในกรณีนี้ หน่วยความจำ cache จะถูกแบ่งออกเป็นเซตจำนวน v เซ็ต แต่ละเซ็ตประกอบด้วยช่องสัญญาณจำนวน k ช่อง สรุปความสัมพันธ์ได้ดังนี้
M = v x k
I = j modulo v
เมื่อ
I = หมายเลขเซ็ตใน cache
J = หมายเลขบล็อกในหน่วยความจำหลัก
M = จำนวนช่องสัญญาณใน cache
4.3 อัลกอริทึมการแทนที่
เมื่อข้อมูลลบบล็อกใหม่ถูกอ่านขึ้นมาจากหน่วยความจำ หนึ่งในบล็อก หนึ่งในบล็อกเดิมที่ถูกอ่านเข้ามาไว้ใน cache จะต้องถูกแทนที่ด้วยบล็อกใหม่ สำหรับไดเร็กแม็บปิงจะมีช่องสัญญาณเพียงช่องเดียวเท่านั้นที่จะเป็นที่อยู่ใน cache สำหรับข้อมูลแต่ละบล็อก จึงไม่จำเป็นต้องคิดหาวิธีการแทนที่ใด ๆ แต่สำหรับการแทนที่ (Replacement algorithm) มาใช้งาน เพื่อตอบสนองความรวดเร็วในการทำงาน วิธีการที่นิยมนำมาใช้กันโดยทั่วไปมี 4 วิธี
1 วิธีแอลอาร์ยู (Least recently used;LRU) เป็นวิธีนำบล็อกใหม่มาแทนที่บล็อกเก่าที่ถูกเก็บไว้ในแคช เป็นเวลานานที่สุด โดยที่มีการนำไปใช้งานน้อยที่สุด สำหรับ 2-way set associative
2 วิธีแบบเข้าคิว (First-in-First-out;FIFO) เป็นวิธีทดแทนบล็อกที่ถูกอ่านขึ้นมานานมากที่สุด
3 วิธีแบบแอลเอฟยู (Lease frequently used;LFU) เป็นวิธีทำการทดแทนบล็อกที่ถูกอ้างอิงเป็นจำนวนครั้งน้อยที่สุด การสร้างขึ้นมาใช้งานจำเป็นจะต้องมีตัวนับการใช้งานข้อมูลแต่ละช่องสัญญาณ เพื่อหาช่องสัญญาณที่มีการนำมาใช้งานน้อยที่สุด
4 วิธีการสุ่ม (random) เป็นวิธีเลือกช่องสัญญาณที่จะถูกทดแทนด้วยวิธีการสุ่มหมายเลขช่องสัญญาณขึ้นมาในแต่ละครั้งที่มีความต้องการเกิดขึ้น
นโยบายการบันทึกลงหน่วยความจำหลัก
ขนาดของบล็อกในแคช
บล็อกที่มีขนาดใหญ่จะลดจำนวนบล็อกที่จะสามารถอ่านเข้ามาเก็บไว้ในแคช เนื่องจากบล็อกใหม่ที่อ่านเข้ามาจะถูกบันทึกแทนที่บล็อกข้อมูลเก่าที่มีอยู่ก่อนหน้า ดังนั้นยิ่งมีจำนวนบล็อกน้อยลงก็จะยิ่งทำให้บล็อกเก่าถูกลบทิ้งเร็วขึ้น อีกทั้งถ้าบล็อกมีขนาดใหญ่ขึ้น ข้อมูลที่อ่านเข้ามาเพิ่มขึ้นจะยิ่งอยู่ในตำแหน่งที่ห่างไกลจากตำแหน่งข้อมูลที่กำลังถูกเรียกใช้งานมากยิ่งขึ้น ซึ่งเป็นการขัดต่อกฎการอ้างอิงพื้นที่ใกล้เคียงดังนั้นจึงมีโอกาสที่จะถูกนำมาใช้งานน้อยลง
ความสัมพันธ์ระหว่างขนาดของบล็อก และอัตราการค้นพบข้อมูลที่ต้องการในแคช (hit ratio) ขึ้นอยู่กับลักษณะการทำงานของแต่ละโปรแกรมเป็นหลัก โดยบล็อกขนาด 8-32 ไบต์เหมาะสมสำหรับงานทั่วไป และขนาด 64-128 ไบต์นั้นเหมาะสมกับเครื่องคอมพิวเตอร์ความสามารถสูง
จำนวนของ Cache
แคชที่มีหลายลำดับชั้น
แคชที่อยู่บนชิพ (On-chip cache) หรือที่เรียกว่าแคช L1
แคชภายนอก ที่เรียกว่าแคช L2
การใช้งานแคชแบบเก็บข้อมูลรวมหรือแยก ถ้าใช้แบบรวมข้อมูลจะมีข้อดีคือ
การเก็บแบบรวมจะมีอัตราการพบข้อมูลมากกว่าการเก็บแบบแยก
การออกแบบและการนำไปใช้งานในการเก็บแบบรวมจะง่ายกว่าการเก็บแบบแยก
แนวโน้มการเก็บข้อมูลจะมุ่งไปทางการเก็บแบบแยก ซึ่งมีข้อดีตรงที่ช่วยลดการแข่งขันของแคชในการนำข้อมูลเข้าและแปลข้อ
Cache แบบหลายระดับ
ปัจจุบันมีการนำแคชทั้งสองชนิดมาใช้งานร่วมกัน และเรียกโครงสร้างประเภทนี้ว่าแคช 2 ระดับ โดยแคชระดับที่ 1 (cache L1) หมายถึง on-chip cache และระดับที่ 2 (cache L2) หมายถึง แคชภายนอก
การนำ cache L2 มาใช้ เนื่องจากเมื่อโปรเซสเซอร์ไม่สามารถหาข้อมูลได้จาก cache L1 ก็จะเกิดการอ้างอิงไปที่หน่วยความจำหลักผ่านบัสหลักของระบบคอมพิวเตอร์ ซึ่งเสียเวลานานมากและทำให้ทั้งระบบมีประสิทธิภาพการทำงานลดลง การนำ cache L2 มาใช้ ข้อมูลส่วนหนึ่งจะถูกพบที่นี่ ซึ่งช่วยให้การเข้าถึงข้อมูลนั้นเร็วมากกว่าการเข้าถึงหน่วยความจำหลักโดยตรง โดยเฉพาะถ้าชิพที่นำมาสร้าง cache L2 เป็นแบบ SRAM ที่มีความเร็วเท่ากับบัสแล้ว ข้อมูลในนี้จะถูกนำส่งโปรเซสเซอร์ได้โดยไม่มีการรอจังหวะสัญญาณนาฬิกา (zero – wait state transaction) เกิดขึ้นเลยซึ่งเป็น cache L2 ชนิดที่เร็วที่สุด
การออกแบบแคช 2 ระดับสำหรับใช้งานมีข้อสังเกต 2 ประการ
1. สำหรับ cache L2 มักไม่เชื่อมโยงเข้ากับบัสหลัก แต่จะมีบัสแยกต่างหาก (local bus) ที่เชื่อมโยง cache L2 เข้ากับโปรเซสเซอร์โดยตรง ทั้งนี้เพื่อเป็นการลดปริมาณข้อมูลที่จะต้องผ่านบัสหลัก
2. สำหรับลดขนาดของอุปกรณ์ภายในโปรเซสเซอร์ให้เล็กลง โดยบรรจุ cache L2 เข้าไปไว้ในชิพโปรเซสเซอร์เช่นเดียวกับ cache L1 ซึ่งจะช่วยเพิ่มประสิทธิภาพให้สูงขึ้น
แคชแบบ Unified (Unified Cache) และแบบ Split (Split Cache)
1. Unified Cache สำหรับเก็บได้ทั้งข้อมูลและคำสั่งปนกัน
ข้อดีของ Unified cache
· สามารถรักษาสมดุลระหว่างการเรียกใช้คำสั่งและข้อมูลได้โดยอัตโนมัติ คือหากมีการเรียกใช้คำสั่งมากกว่าข้อมูล แคชก็จะถูกบันทึกไว้ด้วยคำสั่งในปริมาณที่มากกว่าข้อมูล และในทางกลับกันแคชจะมีข้อมูลมากกว่าคำสั่งถ้าโปรแกรมที่กำลังทำงานอยู่นั้นอ้างอิงข้อมูลจำนวนมากโดยใช้คำสั่งซ้ำๆ
· การออกแบบและสร้างง่ายกว่าเพราะไม่ต้องแยกชนิดของแคช
2 . Split Cache สำหรับเก็บคำสั่งและสำหรับเก็บข้อมูลออกจากกัน
ข้อดีของ Split cache
ช่วยกำจัดความคับคั่งของแคช ระหว่างหน่วยที่ดึงและแปลความหมายคำสั่ง (instruction prefetcher) และหน่วยที่ทำการประมวลผล (execution unit) ซึ่งเป็นสิ่งทีสำคัญมากในการออกแบบคำสั่งแบบไปป์ไลน์ (pipelined instruction) คือ โดยปกติโปรเซสเซอร์จะดึงคำสั่งเข้ามาล่วงหน้าและคอยเติมบัฟเฟอร์หรือไปป์ไลน์ด้วยคำสั่งที่จะประมวลผลให้ต่อเนื่องอยู่เสมอ ในกรณีที่ใช้ unified cache เมื่อการประมวลผลมีการอ้างอิงถึงการอ่านหรือบันทึกข้อมูลลงในหน่วยความจำ ความต้องการนี้จะถูกส่งไปที่ unified cache ถ้าในเวลาเดียวกัน หน่วยที่ดึงและแปลความหมายคำสั่งก็ออกคำสั่งให้ unified cache อ่านคำสั่งต่อไปเข้ามา ก็จะถูกสั่งให้หยุดรอเป็นการชั่วคราว เพื่อรอให้การส่งข้อมูลไปยังหน่วยประมวลผลเสร็จสิ้นก่อนจึงจะส่งคำสั่งต่อไปให้ ปัญหาความคับคั่งในการใช้งานนี้ จะลดประสิทธิภาพการทำงานของไปป์ไลน์ลงไปอย่างมาก ซึ่ง split cache สามารถแก้ปัญหานี้ได้
4.4 – 1 โครงสร้างของ Cache ใน Pentium 4
วิวัฒนาการของการพัฒนาหน่วยความจำ Cache สามารถเห็นได้ชักเจนจากวิวัฒนาการของไมโครโปรเซสเซอร์จากบริษัทอินเทลโปรเซ็สเซอร์
รูป 4.13แสดงโครงสร้างแบบง่ายๆของ Pentium 4 โดยเน้นที่ Cache ทั้งสามส่วนแกนหลักของโปรเซสเซอร์ประกอบด้วยส่วนสำคัญดังนี้
โครงสร้าง Cache สำหรับคำสั่ง (instruction cache) ของโปรเซสเซอร์ Pentium 4 แตกต่างจากโครงสร้างที่ใช้ใน Pentium รุ่นก่อนหน้าและโปรเซสเซอร์อื่นทั่วไป
หน่วยความจำ data cache ใช้ในนโยบายการบันทึกข้องมูลแบบ write-back นั้นคือข้อมูลใน Cacheจะถูกบันทึกลงในหน่วยความจำ
การควบคุม L1 data Cache นั้นกระทำผ่านข้อมูลจำนวน 2บีตที่เก็บอยู่ในรีจิสเตอร์สำหรับการควบคุมคือ CD และ NW ซึ่งมีค่าต่างๆดังที่แสดงในตราง 4.4 นอกจานี้ยังมีคำสั่งของ Pentium 4 อีกสองคำสั่งเพื่อใช้ในการ
ควบคุมข้อมูลใน CacheคือINVD ซึ่งจะบังคับให้บันทึกข้อมูลใน Cache ลงหน่วยความจำหลัก และส่งสัญญาณอย่างเดียวกันนี้ไปยัง L2 Cache เพื่อทำงานอย่างเดียวกันและ WBINVD ซึ่งจะสั่งการให้ใช้วิธีการ write back พร้อมกับการบังคับให้มีการบันทึกใน Cache ลงในหน่วยความจำหลัก และสั่งต่อไปให้ L2 Cache เพื่อให้ทำงานอย่าเดียวกัน
4.4 – 2 โครงสร้างของ Cache ใน PowrerPC
โครงสร้าง cache ของโปรเซสเซอร์ PowerPC แสดงให้เห็นถึงความเกี่ยวข้องกับโครงสร้างทั้งหมดของโปรเซสเซอร์ในตระกูลนี้ ในการพัฒนาประสิทธิภาพอย่างไม่หยุดยั้งอันเป็นความตั้งใจของนักออกแบบทุกคน ตาราง 4.5 แสดงให้เห็นถึงความก้าวหน้าในการพัฒนานี้เริ่มต้นจาก 601 ซึ่งเป็นโมเดลแรก ประกอบด้วย cache รวมขนาด 32 Kbytes แบบ 8-way เซ็ตแอสโซซิเอทิฟ รุ่น 603 มีโครงสร้าง RISC ที่ซับซ้อนมากขั้นแต่มี cache ขนาดเล็กลงคือ 16 Kbytes สำหรับคำสั่ง ซึ่งเป็นแบบ 2-way เซ็ตแอสโซซิเอทีฟทั้งสองชนิด ทำให้ 603 มีความสามารถระดับเดียวกับ 601 แต่มีราคาถูกลง รุ่น 604 และ 620 เพิ่มขนาดของ cache เป็นสองเท่าทั้งสองส่วน โปรเซสเซอร์ G3 และ G4 มี L1 cache ขนาดเท่ากับรุ่น 620
ตาราง 4.5 หน่วยความจำ cache ภายใน PowerPC
Model Size Bytes/Line Organization
PowerPc601 1 32-Kbyte 32 8-way set associative
PowerPc603 2 8-Kbyte 32 2-way set associative
PowerPc604 2 16-Kbyt e 32 4-way set associative
PowerPc620 2 32-Kbyte 64 8-way set associative
PowerPc G3 2 32-Kbyte 64 8-way set associative
PowerPc G4 2 32-Kbyte 32 8-way set associative
รูป 4.14 แสดงภาพโครงสร้างของ PowerPC G4 โดยเน้นที่ตำแหน่งของ cache ทั้งสองส่วน หน่วยประมวลผล (execution unit) ประกอบด้วย integer arithmetic and logic unit จำนวน 2 หน่วยซึ่งสามารถทำงานได้พร้อมกัน และ floating-point unit จำนวน 1 หน่วยที่มีรีจิเตอร์ ตัวคูณ (multiplier) ตัวบวก (adder) และตัวหาร (divider) เป็นของตนเอง หน่วย data cache จะป้อนข้อมูลทั้งที่เป็น integer และ floating-point ผ่านหน่วย load/store ส่วน instruction หน่วย L1 cache จัดโครงสร้างแบบ 8-way เซ็ตแอสโซซิเอทิฟ และ L2 cache จัดโครงสร้างแบบ 2-way เซ็ตแอสโซซิเอทิฟที่มีขนาด 256Kyte,512Kyte, หรือ 1 Mbyte
ณัฐภรณ์ พันทวี 5401103077040
หลังจากที่ได้อ่าน มีความรู้สึกว่า บางอย่างของเนื้อหาก็ไม่เข้าใจ
บางอย่างก็เข้าใจง่ายดีครับ
ขอบคุณครับ