ผู้อ่านเป้าหมาย
- ผู้ที่สนใจการเขียนโปรแกรม CPU แบบ SIMD
- โปรแกรมเมอร์ Amiga ที่อยากรู้วิธีคำนวณค่า blitter แบบ "minterm"
คำสั่งปฏิบัติการตรรกะแบบไตรภาคระดับบิตของ AVX-512
- ได้แรงบันดาลใจจากการบรรยายของ Tom Forsyth เกี่ยวกับการออกแบบ ISA ของ AVX-512
- คำสั่ง vpternlogd เป็นคำสั่งที่ใช้แหล่งอินพุตสามตัวเพื่อทำปฏิบัติการตรรกะระดับบิต
- สามารถใช้งานรีจิสเตอร์ 512 บิตเป็นอินพุต เพื่อทำปฏิบัติการตรรกะที่ซับซ้อนด้วยคำสั่งเดียว
- ใช้ค่า immediate 8 บิตเพื่อกำหนดปฏิบัติการตรรกะระดับบิตอย่างเจาะจง
ชิปคัสตอม blitter ของ Amiga
- คอมพิวเตอร์ในยุค 1980 มีชิปคัสตอมสำหรับประมวลผลกราฟิก
- ชิป blitter ของ Commodore Amiga 500 ใช้ย้ายกราฟิกแบบบิตแมปและทำปฏิบัติการตรรกะ
- ควบคุมการผสมตรรกะด้วยการตั้งค่า "minterm" ซึ่งเป็นค่า 8 บิต
- โปรแกรมเมอร์ Amiga จำนวนมากไม่รู้วิธีคำนวณค่า minterm
วิธีคำนวณค่า minterm แบบง่าย
- ไม่จำเป็นต้องเข้าใจค่า 8 บิตนี้เป็นชุดของตัวดำเนินการตรรกะ
- สามารถมองว่าเป็น ตารางค้นหาอย่างง่าย ได้เลย
- ตัวอย่างเช่น ตั้งค่าให้ผลลัพธ์เป็น 1 เมื่อในบิตอินพุตทั้งสามมีค่า 1 อยู่พอดีสองบิต
- อ่านค่า 8 บิตจากล่างขึ้นบนจะได้ 0x68
ความบังเอิญที่น่าสนุก
- ค่า minterm 0xE2 ที่ใช้บ่อยบน Amiga ถูกใช้สำหรับการเรนเดอร์สไปรต์ 2D แบบมีมาสก์
- การที่เอกสารของ Intel เลือก 0xE2 เป็นตัวอย่างของค่า #imm8 อาจเป็นเพียงความบังเอิญ
บทสรุป
- อาจมีแฟน Amiga อยู่ในทีมที่ทำตัวอย่างเอกสารของ Intel
- กลิ่นอายย้อนยุคสักหน่อยก็ไม่ใช่เรื่องแย่
สรุปโดย GN⁺
- คำสั่ง vpternlogd ของ AVX-512 เป็นเครื่องมือทรงพลังที่สามารถทำปฏิบัติการตรรกะระดับบิตอันซับซ้อนได้ด้วยคำสั่งเดียว
- ความคล้ายกับชิป blitter ของ Amiga น่าสนใจในมุมมองทางประวัติศาสตร์
- บทความนี้แสดงให้เห็นความเชื่อมโยงระหว่างการเขียนโปรแกรมสมัยใหม่กับเทคโนโลยีย้อนยุค และมอบมุมมองที่เป็นประโยชน์ให้โปรแกรมเมอร์
- โครงการที่มีความสามารถคล้ายกัน ได้แก่ AVX-512 ของ Intel และสถาปัตยกรรม Zen ของ AMD
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
มีวิธีง่าย ๆ ในการคำนวณนิพจน์บางแบบ ตัวอย่างเช่น ถ้าต้องการคำนวณ
(NOT A) OR ((NOT B) XOR (C AND A))ก็สามารถเขียนนิพจน์โดยใช้ค่าคงที่_MM_TERNLOG_A,_MM_TERNLOG_B,_MM_TERNLOG_Cได้ตอนแรกนึกว่าหัวข้อบอกว่าคำสั่งมีปัญหาและทำงานไม่ถูกต้อง แต่จริง ๆ แล้วเป็นการอธิบายวิธีการทำงานของมัน
เคยพยายามทำความเข้าใจฮาร์ดแวร์แมนนวลแต่ไม่สำเร็จ ต่อมาจึงได้ A+ ในวิชาตรรกะเชิงคำนวณตอนมหาวิทยาลัย
โดยปกติ "ตรรกะสามค่า" มักหมายถึงตรรกะที่มีค่าความจริงสามค่า แต่บทความนี้พูดถึงคำสั่งคอมไพเลอร์ที่จัดการเกตตรรกะทวิภาคทั้งหมดที่มีอินพุตสามตัว
ฟังก์ชันตัวอย่าง "E2" ในเอกสารเป็นฟังก์ชันบูลีนพื้นฐานที่สุดแบบหนึ่งที่มีอินพุต 3 ตัว โดยเป็น MUX ที่เลือก C เมื่อ A เท่ากับ B ซึ่งเป็นฟังก์ชันสากล
ใช้ตารางค้นหา (LUT) เช่นเดียวกับวิธีที่ FPGA ใช้เพื่อทำฟังก์ชันตรรกะตามต้องการ
ดูเหมือนว่าตอนเรียนปริญญาตรีจะตั้งใจเรียนวิชาคณิตศาสตร์ไม่ต่อเนื่องมากทีเดียว
ถ้าไปค้นหา VPTERNLOG บน sandpile.org จะเห็นแผนเก่า ๆ ของ Intel ที่เกี่ยวกับการมาสก์ไบต์และเวิร์ด (AVX512BITALG2)
ใน Nvidia SASS ก็มีคำสั่งคล้ายกันอยู่ด้วย (LOP3.LUT)
อีกตัวอย่างหนึ่งของการแพ็กการดำเนินการระดับบิตเป็นจำนวนเต็มคือโค้ด GDI ROP ของ win32